Commit 919df19a authored by Berenger Bramas's avatar Berenger Bramas

Update tutorial

parent e120bbd9
......@@ -8,24 +8,32 @@ echo ""
echo "Using granularities:"
echo "$SCALFMM_BS_CPU_SEQ and $SCALFMM_BS_CPU_PAR"
# only in seq with the seq bs
STARPU_NCPUS=1
STARPU_NCUDA=0
logoutput=`./Tests/Release/testBlockedUnifCudaBench -nb $SCALFMM_NB -h $SCALFMM_H -bs $SCALFMM_BS_CPU_SEQ`
if [[ $VERBOSE ]] ; then
echo $logoutput
fi
$SCALFMM_STARPU_DIR/bin/starpu_fxt_tool -i "/tmp/prof_file_"$USER"_0"
rec_name="$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_BS_CPU_SEQ-CPU_$cpu.rec"
mv trace.rec $rec_name
python $SCALFMM_STARPU_DIR/bin/starpu_trace_state_stats.py -t $rec_name > $rec_name.time
for (( cpu=1 ; cpu<=$SCALFMM_MAX_NB_CPU ; cpu++)) ; do
echo ">> CPU = $cpu"
STARPU_NCPUS=$cpu
STARPU_NCUDA=0
logoutput=`./Tests/Release/testBlockedUnifCudaBench -nb $SCALFMM_NB -h $SCALFMM_H -bs $SCALFMM_BS_CPU_SEQ`
if [[ $VERBOSE ]] ; then
echo $logoutput
fi
rec_name="$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_CPU_SEQ-CPU_$cpu.rec"
mv trace.rec $rec_name
python $SCALFMM_STARPU_DIR/bin/starpu_trace_state_stats.py -t $rec_name > $rec_name.time
logoutput=`./Tests/Release/testBlockedUnifCudaBench -nb $SCALFMM_NB -h $SCALFMM_H -bs $SCALFMM_BS_CPU_PAR`
if [[ $VERBOSE ]] ; then
echo $logoutput
fi
rec_name="$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_CPU_PAR-CPU_$cpu.rec"
$SCALFMM_STARPU_DIR/bin/starpu_fxt_tool -i "/tmp/prof_file_"$USER"_0"
rec_name="$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_BS_CPU_PAR-CPU_$cpu.rec"
mv trace.rec $rec_name
python $SCALFMM_STARPU_DIR/bin/starpu_trace_state_stats.py -t $rec_name > $rec_name.time
done
......
0 granularity-eff tasks-eff runtime-eff pipeline-eff
1 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00
2 9.588832e-01 9.588832e-01 9.972215e-01 9.999844e-01
3 9.984195e-01 9.984195e-01 9.992539e-01 9.999840e-01
4 9.936055e-01 9.936055e-01 9.992505e-01 9.999843e-01
5 9.859209e-01 9.859209e-01 9.991938e-01 9.999840e-01
6 9.913540e-01 9.913540e-01 9.992224e-01 9.999848e-01
7 9.980442e-01 9.980442e-01 9.993216e-01 9.999841e-01
8 9.932070e-01 9.932070e-01 9.993356e-01 9.999844e-01
9 9.953908e-01 9.953908e-01 9.993136e-01 9.999852e-01
10 9.930517e-01 9.930517e-01 9.991280e-01 9.999848e-01
11 9.937148e-01 9.937148e-01 9.992802e-01 9.999838e-01
12 9.895039e-01 9.895039e-01 9.992958e-01 9.999842e-01
13 9.934571e-01 9.934571e-01 9.992770e-01 9.999845e-01
14 9.939346e-01 9.939346e-01 9.993242e-01 9.999845e-01
15 9.929928e-01 9.929928e-01 9.993077e-01 9.999849e-01
16 9.946804e-01 9.946804e-01 9.993051e-01 9.999838e-01
17 9.959137e-01 9.959137e-01 9.992893e-01 9.999839e-01
18 9.652375e-01 9.652375e-01 9.961152e-01 9.999832e-01
19 9.937258e-01 9.937258e-01 9.992987e-01 9.999845e-01
20 9.949256e-01 9.949256e-01 9.992757e-01 9.999843e-01
21 9.886613e-01 9.886613e-01 9.992616e-01 9.999838e-01
22 9.921982e-01 9.921982e-01 9.992499e-01 9.999842e-01
23 1.001717e+00 1.001717e+00 9.992881e-01 9.999846e-01
24 9.957642e-01 9.957642e-01 9.992461e-01 9.999836e-01
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <cassert>
#include <sstream>
#include <cstring>
template <class VariableType>
inline VariableType StrToOther(const std::string& str, const VariableType& defaultValue = VariableType(), bool* hasWorked = nullptr){
std::istringstream iss(str,std::istringstream::in);
VariableType value = defaultValue;
iss >> value;
if(hasWorked){
if(!iss.eof()){
char c;
iss >> c;
(*hasWorked) = (c == '\n' || c == '\0');
}
else{
(*hasWorked) = true;
}
}
if( /*iss.tellg()*/ iss.eof() ) return value;
return defaultValue;
}
std::string ReduceName(const std::string name){
const std::vector<std::pair<std::string,std::string>> mapping=
{ {"M2M-level", "M2M"} , {"M2L-level", "M2L"} , {"M2L-out-level", "M2L-out"} ,
{"L2L-level", "L2L"} };
for(const std::pair<std::string,std::string> mp : mapping){
if(name.substr(0, mp.first.length()) == mp.first){
return mp.second;
}
}
return name;
}
struct LineData{
std::string name;
int nb;
std::string type;
double duration;
LineData(const char line[]){
std::vector<std::string> words;
{
int start = 0;
int end = 1;
while(line[end] != '\0'){
while(line[end] != '\0'
&& line[end] != ','){
end += 1;
}
if(line[end] != '\0'){
words.push_back(std::string(&line[start], end-start));
end += 1;
start = end;
}
}
if(start != end){
words.push_back(std::string(&line[start], end-start));
}
}
if(words.size() != 4){
printf("Error line is no composed of 4 words\n");
exit(111);
}
name = ReduceName(words[0].substr(1, words[0].size() - 2));
bool hasWorked = false;
nb = StrToOther<int>(words[1], -1, &hasWorked);
if(hasWorked == false){
printf("Error cannot get nb val\n");
exit(112);
}
type = words[2].substr(1, words[2].size() - 2);
duration = StrToOther<double>(words[3], 0, &hasWorked);
if(hasWorked == false){
printf("Error cannot get duration val\n");
exit(112);
}
}
};
struct TimeData{
TimeData()
: tt(0), tr(0), ti(0){
}
double tt; // time in task
double tr; // time in runtime
double ti; // time idle
};
/*
"Name","Count","Type","Duration"
"Initializing",24,"Runtime",1.259594
"Overhead",6304,"Runtime",150.667381
"Idle",1635,"Other",2.964436
"Scheduling",3285,"Runtime",50.173307
"Sleeping",330,"Other",10978.895357
"FetchingInput",1611,"Runtime",2.834788
"execute_on_all_wrapper",48,"Task",60.98058
"PushingOutput",1611,"Runtime",49.857017
"P2P-out",403,"Task",3840.070231
"Callback",1447,"Runtime",0.459004
"P2M",49,"Task",7759.555381
"M2M-level-5",49,"Task",916.867961
"M2L-level-5",7,"Task",3866.40312
"M2M-level-4",7,"Task",90.183757
"M2L-out-level-5",32,"Task",809.783766
"P2P",49,"Task",28378.015095
"L2L-level-5",49,"Task",749.115965
"M2L-level-6",49,"Task",33069.582498
"M2L-out-level-6",806,"Task",10014.65321
"L2P",49,"Task",10532.198512
"Deinitializing",24,"Runtime",0.600177
"M2L-level-3",1,"Task",45.115451
"M2L-level-2",1,"Task",2.638928
"L2L-level-2",1,"Task",1.343462
"L2L-level-4",7,"Task",87.756298
"L2L-level-3",1,"Task",10.658414
"M2M-level-3",1,"Task",11.480571
"M2M-level-2",1,"Task",1.41104
"M2L-level-4",1,"Task",511.345345
*/
int main(int argc, char** argv){
if(argc != 4){
printf("Error usage is:\n"
"%s seq_file parallel_file%%d nb_threads\n",
argv[0]);
return 200;
}
printf("seq file is %s\n", argv[1]);
printf("parallel file are %s\n", argv[2]);
const int nbThreads = StrToOther<int>(argv[3], -1);
if(nbThreads == 1){
printf("Error cannot convert nb threads\n");
return 201;
}
printf("up to %d threads\n", nbThreads);
std::vector<std::unordered_map<std::string,double>> timeTasks;
std::unordered_set<std::string> allTaskNames;
std::vector<TimeData> times;
for(int idxFile = 0 ; idxFile <= nbThreads ; ++idxFile){
char filename[1024];
if(idxFile == 0){
strncpy(filename, argv[1], 1024);
}
else{
sprintf(filename, argv[2], idxFile);
}
timeTasks.emplace_back();
times.emplace_back();
printf("Open file : %s\n", filename);
FILE* timeFile = fopen(filename, "r");
if(timeFile == NULL){
printf("Cannot open file %s\n", filename);
return 99;
}
size_t sizeLine = 1024;
char* line = (char*)malloc(sizeLine);
{// Read header
if((sizeLine = getline((char**)&line, &sizeLine, timeFile)) == -1){
printf("Cannot read header\n");
return 1;
}
// Should be: "Name","Count","Type","Duration"
if(strcmp("\"Name\",\"Count\",\"Type\",\"Duration\"\n",
line) != 0){
printf("Header is incorrect\n");
return 2;
}
}
while((sizeLine = getline((char**)&line, &sizeLine, timeFile)) != -1){
LineData dt(line);
// Task, Runtime, Other
if(dt.type == "Task"){
if(dt.name != "execute_on_all_wrapper"){
timeTasks[idxFile][dt.name] += dt.duration;
allTaskNames.insert(dt.name);
times[idxFile].tt += dt.duration;
}
}
else if(dt.type == "Runtime"){
if(dt.name == "Scheduling"
|| dt.name == "FetchingInput"
|| dt.name == "PushingOutput"){
times[idxFile].tr += dt.duration;
}
}
else if(dt.type == "Other"){
if(dt.name == "Idle"){
times[idxFile].ti += dt.duration;
}
}
else {
printf("Arg do not know type %s\n", dt.type.c_str());
return 3;
}
}
fclose(timeFile);
}
// Global efficiencies
{
// Manually set seq idel and runtime
times[0].ti = 0;
times[0].tr = 0;
times[1].ti = 0;
times[1].tr = 0;
printf("Create global-eff.data\n");
FILE* resFile = fopen("global-eff.data", "w");
assert(resFile);
fprintf(resFile, "0 \tgranularity-eff \ttasks-eff \truntime-eff \tpipeline-eff\n");
for(int idx = 1; idx <= nbThreads ; ++idx){
fprintf(resFile, "%d \t%e \t%e \t%e \t%e\n",
idx,
times[0].tt/times[idx].tt,
times[1].tt/times[idx].tt,
times[idx].tt/(times[idx].tt+times[idx].tr),
(times[idx].tt+times[idx].tr)/(times[idx].tt+times[idx].tr+times[idx].ti));
}
fclose(resFile);
}
// Global efficiencies
{
printf("Create task-eff.data\n");
FILE* resFile = fopen("task-eff.data", "w");
assert(resFile);
fprintf(resFile, "0 ");
for(const std::string tsk : allTaskNames){
fprintf(resFile, "\t%s ", tsk.c_str());
}
fprintf(resFile, "\n");
for(int idx = 1; idx <= nbThreads ; ++idx){
fprintf(resFile, "%d", idx);
for(const std::string tsk : allTaskNames){
fprintf(resFile, "\t%e ", timeTasks[1][tsk]/timeTasks[idx][tsk]);
}
fprintf(resFile, "\n");
}
fclose(resFile);
}
{
printf("Create task-gr-eff.data\n");
FILE* resFile = fopen("task-gr-eff.data", "w");
assert(resFile);
fprintf(resFile, "0 ");
for(const std::string tsk : allTaskNames){
fprintf(resFile, "\t%s ", tsk.c_str());
}
fprintf(resFile, "\n");
for(int idx = 1; idx <= nbThreads ; ++idx){
fprintf(resFile, "%d", idx);
for(const std::string tsk : allTaskNames){
fprintf(resFile, "\t%e ", timeTasks[0][tsk]/timeTasks[idx][tsk]);
}
fprintf(resFile, "\n");
}
fclose(resFile);
}
return 0;
}
This diff is collapsed.
......@@ -26,6 +26,7 @@ In order to follow this tutorial, it is needed to have the following application
* CUDA (>= 7) and `CUDA_PATH` must be set. In our case, `CUDA_PATH=/usr/local/cuda-7.5/`
* __Optional__ Vite (from `sudo apt-get install vite` or see [http://vite.gforge.inria.fr/download.php](http://vite.gforge.inria.fr/download.php))
* __Optional__ Qt5 library to be able to change the colors of the execution traces in order to visualize the different FMM operators
* gnuplot to generate the figures
> [Remark] Some installations of CUDA does not have libcuda file.
> In this case, one needs to create a link : `sudo ln /usr/local/cuda-7.5/lib64/libcudart.so /usr/local/cuda-7.5/lib64/libcuda.so`
......@@ -50,8 +51,9 @@ cd $SCALFMM_TEST_DIR
In order to be able to stop the tutorial in the middle and restart later, we will register the variables in a file that should be source to restart later:
```bash
function scalfmmRegisterVariable() { echo "export $1=${!1}" >> "$SCALFMM_TEST_DIR/environment.source"; }
echo "function scalfmmRegisterVariable() { echo \"export $1=${!1}\" >> \"$SCALFMM_TEST_DIR/environment.source\"; }" > "$SCALFMM_TEST_DIR/environment.source"
# function scalfmmRegisterVariable() { echo "export $1=${!1}" >> "$SCALFMM_TEST_DIR/environment.source"; }
echo "function scalfmmRegisterVariable() { echo \"export \$1=\${!1}\" >> \"$SCALFMM_TEST_DIR/environment.source\"; }" > "$SCALFMM_TEST_DIR/environment.source"
source "$SCALFMM_TEST_DIR/environment.source"
```
*Output variables:* `scalfmmRegisterVariable SCALFMM_TEST_DIR`
......@@ -75,7 +77,7 @@ cd $SCALFMM_TEST_DIR
source "$SCALFMM_TEST_DIR/environment.source"
```
### Downloading Packages
### Downloading the Packages (in Advance)
If the computational node does not have access to internet, we provide a command to download the needed packages (otherwise the next commands still include just in time download):
```bash
......@@ -285,7 +287,8 @@ Then visualize the output with `vite`
vite ./paje.trace
```
Should be like: // IMAGE HERE
Should be like:
![Trace](trace-example.png)
We can convert the color of the trace by (requiere Qt5 library):
......@@ -294,7 +297,8 @@ $SCALFMM_SOURCE_DIR/Addons/BenchEfficiency/pajecolor paje.trace $SCALFMM_SOURCE_
vite ./paje.trace.painted
```
Should be like: // IMAGE HERE
Should be like:
![Trace](trace-example-colors.png)
+ Get execution times
......@@ -386,39 +390,65 @@ In our case we get 9710 and 5385.
*Output variable:* `scalfmmRegisterVariable SCALFMM_BS_CPU_SEQ` `scalfmmRegisterVariable SCALFMM_BS_CPU_PAR`
We can look to the work that has been done to find the best granularity:
![In sequential](seq-bs-search.png)
![In parallel](par-bs-search.png)
Then we compute the efficiency using both granulirities and keep the .rec files:
```bash
export SCALFMM_MAX_NB_CPU=24
export STARPU_NCUDA=0
source $SCALFMM_AB/execAllHomogeneous.sh
source "$SCALFMM_AB/execAllHomogeneous.sh"
```
We should end with all the .rec files and their corresponding time files
We should end with all the .rec files and their corresponding time files and `ls "$SCALFMM_RES_DIR"` should return something like:
```bash
ls $SCALFMM_RES_DIR
trace-nb_10000000-h_7-bs_5385-CPU_1.rec trace-nb_10000000-h_7-bs_9710-CPU_15.rec.time trace-nb_10000000-h_7-bs_9710-CPU_21.rec trace-nb_10000000-h_7-bs_9710-CPU_4.rec.time
trace-nb_10000000-h_7-bs_5385-CPU_1.rec.time trace-nb_10000000-h_7-bs_9710-CPU_16.rec trace-nb_10000000-h_7-bs_9710-CPU_21.rec.time trace-nb_10000000-h_7-bs_9710-CPU_5.rec
trace-nb_10000000-h_7-bs_9710-CPU_10.rec trace-nb_10000000-h_7-bs_9710-CPU_16.rec.time trace-nb_10000000-h_7-bs_9710-CPU_22.rec trace-nb_10000000-h_7-bs_9710-CPU_5.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_10.rec.time trace-nb_10000000-h_7-bs_9710-CPU_17.rec trace-nb_10000000-h_7-bs_9710-CPU_22.rec.time trace-nb_10000000-h_7-bs_9710-CPU_6.rec
trace-nb_10000000-h_7-bs_9710-CPU_11.rec trace-nb_10000000-h_7-bs_9710-CPU_17.rec.time trace-nb_10000000-h_7-bs_9710-CPU_23.rec trace-nb_10000000-h_7-bs_9710-CPU_6.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_11.rec.time trace-nb_10000000-h_7-bs_9710-CPU_18.rec trace-nb_10000000-h_7-bs_9710-CPU_23.rec.time trace-nb_10000000-h_7-bs_9710-CPU_7.rec
trace-nb_10000000-h_7-bs_9710-CPU_12.rec trace-nb_10000000-h_7-bs_9710-CPU_18.rec.time trace-nb_10000000-h_7-bs_9710-CPU_24.rec trace-nb_10000000-h_7-bs_9710-CPU_7.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_12.rec.time trace-nb_10000000-h_7-bs_9710-CPU_19.rec trace-nb_10000000-h_7-bs_9710-CPU_24.rec.time trace-nb_10000000-h_7-bs_9710-CPU_8.rec
trace-nb_10000000-h_7-bs_9710-CPU_13.rec trace-nb_10000000-h_7-bs_9710-CPU_19.rec.time trace-nb_10000000-h_7-bs_9710-CPU_2.rec trace-nb_10000000-h_7-bs_9710-CPU_8.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_13.rec.time trace-nb_10000000-h_7-bs_9710-CPU_1.rec trace-nb_10000000-h_7-bs_9710-CPU_2.rec.time trace-nb_10000000-h_7-bs_9710-CPU_9.rec
trace-nb_10000000-h_7-bs_9710-CPU_14.rec trace-nb_10000000-h_7-bs_9710-CPU_1.rec.time trace-nb_10000000-h_7-bs_9710-CPU_3.rec trace-nb_10000000-h_7-bs_9710-CPU_9.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_14.rec.time trace-nb_10000000-h_7-bs_9710-CPU_20.rec trace-nb_10000000-h_7-bs_9710-CPU_3.rec.time
trace-nb_10000000-h_7-bs_9710-CPU_15.rec trace-nb_10000000-h_7-bs_9710-CPU_20.rec.time trace-nb_10000000-h_7-bs_9710-CPU_4.rec
```
We compute the efficiencies
We now compute the efficiencies from these files
```bash
source $SCALFMM_AB/computeHomogeneousEfficiencies
g++ -std=c++11 $SCALFMM_AB/mergetimefile.cpp -o $SCALFMM_AB/mergetimefile.exe
$SCALFMM_AB/mergetimefile.exe "$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_BS_CPU_SEQ-CPU_1.rec" "$SCALFMM_RES_DIR/trace-nb_$SCALFMM_NB-h_$SCALFMM_H-bs_$SCALFMM_BS_CPU_SEQ-CPU_%d.rec" $SCALFMM_MAX_NB_CPU
```
We end with efficiency for the application and for the operators.
```bash
cat $SCALFMM_RES_DIR/efficiencies.txt
Create global-eff.data
Create task-eff.data
Create task-gr-eff.dat
```
We can plot each of them
```bash
source $SCALFMM_AB/plotEfficiencies.sh $SCALFMM_RES_DIR/efficiencies.txt
gnuplot -e "filename='global-eff'" $SCALFMM_AB/scalfmmPlotAll.gplot
gnuplot -e "filename='task-eff'" $SCALFMM_AB/scalfmmPlotAll.gplot
gnuplot -e "filename='task-gr-eff'" $SCALFMM_AB/scalfmmPlotAll.gplot
```
Sould give: // IMAGE HERE
In our case it gives:
![global-eff](global-eff.png)
![task-eff](task-eff.png)
![task-gr-eff](task-gr-eff.png)
## Heterogeneous
__NOT FINISHED!!!!__
For test case `-nb 10000000` (10 million) and `-h 6` (height of the tree equal to 6),
we first want to know the best granularity `-bs`.
......
#!/usr/bin/gnuplot
reset
set terminal png
set output filename . '.png'
set xlabel "Nb Threads"
set ylabel "Efficiency"
set grid
set style data linespoints
N = system("awk 'NR==1{print NF}' " . filename . ".data")
set key outside;
set key right top;
set key autotitle columnhead
do for [col=2:N:1] {
set style line col lw 3
}
plot for [col=2:N:1] filename . '.data' using 1:col with lp
0 L2L M2M P2M L2P M2L-out M2L P2P-out P2P
1 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00
2 9.565659e-01 9.665736e-01 1.031103e+00 1.004286e+00 9.715094e-01 9.208541e-01 9.697996e-01 9.763831e-01
3 9.263068e-01 1.024516e+00 1.029574e+00 9.889095e-01 9.937418e-01 9.954310e-01 1.001689e+00 1.000994e+00
4 1.005226e+00 1.006333e+00 1.033745e+00 1.010624e+00 9.534195e-01 9.864280e-01 9.895790e-01 9.995851e-01
5 8.615300e-01 9.844517e-01 9.938413e-01 1.009990e+00 9.569465e-01 9.791331e-01 9.887700e-01 9.975625e-01
6 8.535893e-01 9.410083e-01 1.014109e+00 1.018876e+00 9.739749e-01 9.860534e-01 9.782539e-01 9.964238e-01
7 1.046813e+00 9.975072e-01 1.037954e+00 1.003486e+00 9.786087e-01 9.933857e-01 1.004895e+00 9.965736e-01
8 9.995985e-01 1.013025e+00 9.895591e-01 1.013030e+00 9.652670e-01 9.907845e-01 1.000561e+00 9.971405e-01
9 1.039365e+00 1.013929e+00 1.047827e+00 9.852421e-01 9.711139e-01 9.898517e-01 9.980679e-01 9.993222e-01
10 9.181035e-01 9.952685e-01 1.031850e+00 1.012496e+00 9.670203e-01 9.852214e-01 9.859215e-01 9.985014e-01
11 8.717502e-01 9.889525e-01 1.028373e+00 1.011922e+00 9.699808e-01 9.888136e-01 9.826419e-01 9.981512e-01
12 9.452144e-01 1.040015e+00 1.013514e+00 9.762884e-01 9.389195e-01 9.915452e-01 9.996240e-01 9.998256e-01
13 1.022490e+00 1.021529e+00 1.014210e+00 9.896566e-01 9.668669e-01 9.898209e-01 1.011145e+00 9.991000e-01
14 9.383201e-01 9.923898e-01 1.030084e+00 1.009296e+00 9.748870e-01 9.858361e-01 1.005721e+00 9.971995e-01
15 9.387378e-01 9.986737e-01 1.032522e+00 9.967096e-01 9.675984e-01 9.877332e-01 1.003181e+00 9.974178e-01
16 9.377196e-01 9.853747e-01 1.043778e+00 1.003874e+00 9.786853e-01 9.873092e-01 1.003464e+00 9.958178e-01
17 9.293735e-01 1.034251e+00 1.038271e+00 1.003177e+00 9.700248e-01 9.915540e-01 9.899480e-01 9.984129e-01
18 9.081814e-01 9.992797e-01 1.018655e+00 9.982681e-01 9.627375e-01 9.752319e-01 9.739917e-01 9.297086e-01
19 9.471672e-01 9.763513e-01 1.026148e+00 1.013503e+00 9.656781e-01 9.868543e-01 9.891711e-01 9.992051e-01
20 9.376034e-01 1.008523e+00 1.015422e+00 9.988900e-01 9.763451e-01 9.917410e-01 1.016855e+00 9.974959e-01
21 9.649789e-01 9.941223e-01 1.023371e+00 9.720318e-01 9.427889e-01 9.864717e-01 1.011408e+00 1.001528e+00
22 8.085859e-01 1.003002e+00 1.024132e+00 1.015483e+00 9.586926e-01 9.888563e-01 9.829068e-01 9.982469e-01
23 9.843031e-01 1.009513e+00 1.041257e+00 1.012564e+00 1.009160e+00 9.949415e-01 9.970272e-01 9.964763e-01
24 9.408696e-01 9.847445e-01 1.030481e+00 9.726508e-01 9.691133e-01 9.975819e-01 1.022271e+00 1.000680e+00
0 L2L M2M P2M L2P M2L-out M2L P2P-out P2P
1 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00 1.000000e+00
2 9.565659e-01 9.665736e-01 1.031103e+00 1.004286e+00 9.715094e-01 9.208541e-01 9.697996e-01 9.763831e-01
3 9.263068e-01 1.024516e+00 1.029574e+00 9.889095e-01 9.937418e-01 9.954310e-01 1.001689e+00 1.000994e+00
4 1.005226e+00 1.006333e+00 1.033745e+00 1.010624e+00 9.534195e-01 9.864280e-01 9.895790e-01 9.995851e-01
5 8.615300e-01 9.844517e-01 9.938413e-01 1.009990e+00 9.569465e-01 9.791331e-01 9.887700e-01 9.975625e-01
6 8.535893e-01 9.410083e-01 1.014109e+00 1.018876e+00 9.739749e-01 9.860534e-01 9.782539e-01 9.964238e-01
7 1.046813e+00 9.975072e-01 1.037954e+00 1.003486e+00 9.786087e-01 9.933857e-01 1.004895e+00 9.965736e-01
8 9.995985e-01 1.013025e+00 9.895591e-01 1.013030e+00 9.652670e-01 9.907845e-01 1.000561e+00 9.971405e-01
9 1.039365e+00 1.013929e+00 1.047827e+00 9.852421e-01 9.711139e-01 9.898517e-01 9.980679e-01 9.993222e-01
10 9.181035e-01 9.952685e-01 1.031850e+00 1.012496e+00 9.670203e-01 9.852214e-01 9.859215e-01 9.985014e-01
11 8.717502e-01 9.889525e-01 1.028373e+00 1.011922e+00 9.699808e-01 9.888136e-01 9.826419e-01 9.981512e-01
12 9.452144e-01 1.040015e+00 1.013514e+00 9.762884e-01 9.389195e-01 9.915452e-01 9.996240e-01 9.998256e-01
13 1.022490e+00 1.021529e+00 1.014210e+00 9.896566e-01 9.668669e-01 9.898209e-01 1.011145e+00 9.991000e-01
14 9.383201e-01 9.923898e-01 1.030084e+00 1.009296e+00 9.748870e-01 9.858361e-01 1.005721e+00 9.971995e-01
15 9.387378e-01 9.986737e-01 1.032522e+00 9.967096e-01 9.675984e-01 9.877332e-01 1.003181e+00 9.974178e-01
16 9.377196e-01 9.853747e-01 1.043778e+00 1.003874e+00 9.786853e-01 9.873092e-01 1.003464e+00 9.958178e-01
17 9.293735e-01 1.034251e+00 1.038271e+00 1.003177e+00 9.700248e-01 9.915540e-01 9.899480e-01 9.984129e-01
18 9.081814e-01 9.992797e-01 1.018655e+00 9.982681e-01 9.627375e-01 9.752319e-01 9.739917e-01 9.297086e-01
19 9.471672e-01 9.763513e-01 1.026148e+00 1.013503e+00 9.656781e-01 9.868543e-01 9.891711e-01 9.992051e-01
20 9.376034e-01 1.008523e+00 1.015422e+00 9.988900e-01 9.763451e-01 9.917410e-01 1.016855e+00 9.974959e-01
21 9.649789e-01 9.941223e-01 1.023371e+00 9.720318e-01 9.427889e-01 9.864717e-01 1.011408e+00 1.001528e+00
22 8.085859e-01 1.003002e+00 1.024132e+00 1.015483e+00 9.586926e-01 9.888563e-01 9.829068e-01 9.982469e-01
23 9.843031e-01 1.009513e+00 1.041257e+00 1.012564e+00 1.009160e+00 9.949415e-01 9.970272e-01 9.964763e-01
24 9.408696e-01 9.847445e-01 1.030481e+00 9.726508e-01 9.691133e-01 9.975819e-01 1.022271e+00 1.000680e+00
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment