From bf126e5a2e472c6c8d2d98488c651730c3ad97f9 Mon Sep 17 00:00:00 2001 From: plwapet <lavoisierwapet@gmail.com> Date: Mon, 2 May 2022 19:03:27 +0200 Subject: [PATCH] making presentation for the team meeting --- .~lock.project_presentation.odp# | 1 + README.md | 0 Relation between energy efficiencies.odp | Bin Relation between energy efficiencies.pdf | Bin What_do_we_want_to_optimize.pdf | Bin android_keystore.jks | Bin configurations_state_on_phone.config | 0 connect_to_Mr_Tu | 244 ++++++++++++++++++ install_battery_drainer_app.sh | 35 +++ install_battery_drainer_app_for_non_rooted.sh | 35 +++ install_battery_voltage_app.sh | 0 install_benchmarking_app.sh | 29 ++- ...l_benchmarking_app_and_add_it_to_cgroup.sh | 0 ...l_benchmarking_app_on_samsung_galaxy_S8.sh | 20 +- install_benchmarking_app_on_sony_xperia.sh | 0 install_interactive_benchmarking_app.sh | 0 ...e_benchmarking_app_on_samsung_galaxy_S8.sh | 0 mini_shell_to_restart_app_on_SamsungS8.sh | 0 project_presentation.odp | Bin 0 -> 35931 bytes remove_fl_task_from_fl_group.sh | 0 research_problem_overview.graphml | 210 +++++++++++++++ 21 files changed, 559 insertions(+), 15 deletions(-) create mode 100755 .~lock.project_presentation.odp# mode change 100644 => 100755 README.md mode change 100644 => 100755 Relation between energy efficiencies.odp mode change 100644 => 100755 Relation between energy efficiencies.pdf mode change 100644 => 100755 What_do_we_want_to_optimize.pdf mode change 100644 => 100755 android_keystore.jks mode change 100644 => 100755 configurations_state_on_phone.config mode change 100644 => 100755 connect_to_Mr_Tu create mode 100755 install_battery_drainer_app.sh create mode 100755 install_battery_drainer_app_for_non_rooted.sh mode change 100644 => 100755 install_battery_voltage_app.sh mode change 100644 => 100755 install_benchmarking_app.sh mode change 100644 => 100755 install_benchmarking_app_and_add_it_to_cgroup.sh mode change 100644 => 100755 install_benchmarking_app_on_samsung_galaxy_S8.sh mode change 100644 => 100755 install_benchmarking_app_on_sony_xperia.sh mode change 100644 => 100755 install_interactive_benchmarking_app.sh mode change 100644 => 100755 install_interactive_benchmarking_app_on_samsung_galaxy_S8.sh mode change 100644 => 100755 mini_shell_to_restart_app_on_SamsungS8.sh create mode 100755 project_presentation.odp mode change 100644 => 100755 remove_fl_task_from_fl_group.sh create mode 100755 research_problem_overview.graphml diff --git a/.~lock.project_presentation.odp# b/.~lock.project_presentation.odp# new file mode 100755 index 0000000..2b694bb --- /dev/null +++ b/.~lock.project_presentation.odp# @@ -0,0 +1 @@ +,DESKTOP-D49H2V3/lavoi,DESKTOP-D49H2V3,02.05.2022 19:02,file:///C:/Users/lavoi/AppData/Roaming/LibreOffice/4; \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/Relation between energy efficiencies.odp b/Relation between energy efficiencies.odp old mode 100644 new mode 100755 diff --git a/Relation between energy efficiencies.pdf b/Relation between energy efficiencies.pdf old mode 100644 new mode 100755 diff --git a/What_do_we_want_to_optimize.pdf b/What_do_we_want_to_optimize.pdf old mode 100644 new mode 100755 diff --git a/android_keystore.jks b/android_keystore.jks old mode 100644 new mode 100755 diff --git a/configurations_state_on_phone.config b/configurations_state_on_phone.config old mode 100644 new mode 100755 diff --git a/connect_to_Mr_Tu b/connect_to_Mr_Tu old mode 100644 new mode 100755 index 1724c15..67e174e --- a/connect_to_Mr_Tu +++ b/connect_to_Mr_Tu @@ -641,13 +641,257 @@ echo $(date +'%d%h%y_%H_%M') ; bash install_benchmarking_app.sh +To find a system file +adb shell "find /sys/ | grep charge_counter" +adb shell "find /sys/ | grep charging_enabled" from francis +/sys/devices/battery.XX/power_supply/battery/hv_charger_set from frank +File name in phone +adb shell dumpsys battery unplug reset +File containing the maximum amout of possible battery on google pixel +ls /sys/devices/platform/soc/soc\:google,battery/power_supply/battery/charge_limit + /sys/devices/platform/soc/soc:google,charger/charge_stop_level +File to deactivate battery charging on Samsung S8 +/sys/devices/platform/battery/power_supply/battery/hv_charger_set +max value of cc_info : 3693000 +Bonjour Vlad, comme compte rendu pour aujourd'hui: +1 - J'ai effectué les expés dont nous avons parlé hier à savoir 1-0, 2-0 et 0-1 et 0-2 sachant que les cores exécutant les threads ont respectivement les fréquences minimum, moyennes et maximum. + Les résultats sont consignés dans le dossier suivant [1]. + On peut tirer comme conclusions que + a - Plus la fréquence des cores est élévée plus la consommation énergétique l'est aussi, il en est de même de la puissance absorbée [2] [3]. + b - Plus la fréquence des cores est élévée plus la workload calculées l'est également [4]. + c - Sur les little core on est beaucoup plus efficace avec la fréquence maximale [5]. + d - Sur les big core on est beaucoup plus efficace avec les la fréquence moyenne [5]. + +2 - Tu avais remarqué en réunion que sur le graphe des configurations 0-1, 0-2 , 0-3, 0-4,0-5, et 0-6 , + les résultats le ration energy/workload des configuration 0-5 et 0-6 ne paraissaient pas suivre la même tendance. + a - J'ai refais les tests spécialement pour ces configurations + b - je me suis rendu compte que j'avais fait une erreur dans la génération des graphes pour la configuration 0-6 (je n'avais pas calculée la bonne workload). Voici le nouveau graphe des résultats [6]. + c - Je me suis aussi rendu compte que comparé aux tests effectués la semaine passée: + - les tests d'aujourd'hui (dont voici le graphe [7]) semblent beaucoup plus suivre la tendance d'efficacité croissante du nombre de thread sur les little cores, + - peut-être parce que le téléphone a eu le temps de se reposer entre temps. + +3 - Hier il m'est venu à l'esprit, a propos du samsung ceci: + a - Il serait convenable d'achater un téléphone, car en plus de problème lié au samsung, le google pixel que nous avons n'a pas une achitecture big-Little parfaite avec deux socket + b - Le problème que tu as soulevé à propos du cc_info c'est l'unité de la valeur qu'elle contient + Je prévoit effectuer des expés en me basant uniquement sur le cc_info pour obtenir l'énergie + je prévois comparer les valeurs initiale et finale du cc_info et voir si j'obtient les valeurs similaires à ceux présentées lundi en réunion. + Si oui je me dis qu'on peut se limiter au cc_info pour les expés + c - il y'a aussi l'option consistant à dépiecer le téléphone comme j'ai dit hier. + +[1] Dossier des résultats obtenus en faisant varier la fréquence des cores sur le google pixel : https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/tree/main/google_pixel_4a_5g_varying_frequency +[2] Courbe de la consommation énergétique, obtenue dans le même contexte que le [1] https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_energy_consumed_according_to_cpu_charge_stop_level_50.png +[3] Courbe de la puissance absorbée, obtenue dans le même contexte que le [1] https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_power_absorbed_according_to_cpu_charge_stop_level_50.png +[4] Courbe de la workload calculée, obtenue dans le même contexte que le [1] https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_workload_according_to_cpu_charge_stop_level_50.png +[5] Courbe de l'efficacité énergétique, obtenue dans le même contexte que le [1] https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50.png +[6] Graphe corrigé du ratio energy/workload effectée pour valider les précédents tests sur le google pixel. https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_varying_the_number_of_thread/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50.png +[7] Graphe avec les nouvelles valeurs du ratio energy/workload pour les configuration 0-5 et 0-6. https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_varying_the_number_of_thread/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50_validation_of_0_5_0_6.png + + +Bonne soirée Vlad. + + + +number_of_cpus = ["mouse", "idle" ,"1-0", "2-0", "3-0", "4-0", "5-0" , "5-0.", "6-0", "6-0.", "6-1", "6-2" ,"0-1", "0-2", "1-1", "2-1", "3-1", "1-2" ] +phone_energy= [ 1308, 11047.73, 29285.405, 38598.14, 46077.78, 53629.51, 58756.40, 56820.57, 66053.62, 64353.13, 106210.78 , 123823.21, 66877.5,115136.69, 73048.75, 79000.24 , 92143.93 , 96571.58 ] +phone_power = [ 40.16, 336.07, 879.245 , 1146.12, 1357.74 , 1572.76, 1718.15, 1661.97, 1918.21, 1871.11, 2970.56 , 3397.90, 1938.45,3179.93, 2106.08, 2267.14 , 2614.01 , 2717.37] +workload = [ 0.1, 0.9, 1.55, 3.368, 4.9563 , 6.906, 7.3213, 9.223199, 7.321324, 11.1178, 17.08829 , 21.384681, 6.7442, 13.210451922, 8.47040, 10.3032, 12.38267 , 12.72335] + +Pour la suite, la best effort task est efficace avec la freq max mais doit-elle empiéter sur les autre task. Evaluer l'efficacité avec l'interactive et des deux à la fois. + + +Shalom Kevin, Avant de passer la nuit où j'habite. Dis moi, dans tes prières, est ce que tu invoques uniquement l'Eternel, ou pas ? + +Je suis désolé Kevin, je ne peux donc pas te permettre de passer la nuit où j'habite. Deutéronome 7:26 (Version Vulgate) + + + +Bonjour Vlad comme compte rendu d'aujourd'hui, + +1 - J'ai pris en compte tes remarques et pour l'instant voici ce que je peux y répondre: + a - En effet comme tu l'as remarqué, il semble beaucoup plus efficace sur les little cores de fixer la fréquence et d'augmenter le nombre de thread de la Best effort task. + J'ai pris note: je tâcherai si possible de tester la configuration 1-1 en fixant les deux cores à la fois et en les fixant tour à tour + puisqu'on peut fixer isolément les fréquences sur deux sockets différents. + b - Afin de voir si cette tendance observée sur les configuration 1-0 et 2-0 se vérifie, + il m'est venue à l'esprit de tester la configuration 3-0 avec les fréquence fixées + c - Je refléchirai aussi au modèle de téléphone à acheter, et si possible je te dirai. + d - Je crois avoir déjà mesuré à la fois la consommation du powermeter et la jauge du cc_info. les résultats sont consigné dans ce fichier [1]. Et en considérant les deux valeur, j'ai présenté récemment en réunion le graphe [1] +[1] fichier des résultats obtenus suite aux expés sur le samsung https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/raw_resut_and_powertool_stats_battery_fully_charged_cc_info.txt +[2] Energy consommée par le samsung calculée en considérant le cc_info et le power_meter https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/Samsung_Gal_S8_energy_consumed_according_to_cpu.png + + +2- Hier je pensais avoir testé la configuration 0-2 avec les fréquences Mid et Min des big cores, +Or il se trouve que j'avais seulement fixé la fréquence d'un seul big core et non des deux. +Aujourd'hui j'ai donc refait les expés en fixant la fréquence de chacun des deux big cores; chacun à son min et à son mid respectivement. +J'ai mis à jour le fichier des résultats [1] ainsi que le graphe de l'efficacité énergétique des configurations testées [2] +Comme résultats, + a- le constat est le même que précédemment: Les big cores sont beaucoup plus efficaces lorsque leur fréquence est moyenne. + b- Il est beaucoup plus efficace de réduire la fréquence des deux big cores en même temps (configuration 0-2h et 0-2m) +[1] Résultats obtenus avec les configuration 0-2 ajoutées et dans lesquelles les fréquences des deux big cores ont été touchées https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/raw_resut_and_powertool_stats.txt +[2] Nouveau graphe du ration energy/workload obtenu dans les mêmes conditions que le [1] https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50.png +3- J'ai aussi fait le test dont je parlais sur le samsung, en mesurant seulement les valeurs initiales et finales du cc_info sans faire intervenir le powermeter. + D'après les résultats obtenus [1], + - les valeurs du même ordre de grandeur. + - Mais ces valeurs me semblent être beaucoup plus proches de la réalité. + car l'énergie du big core est presque 3 fois supérieure à celle du little + Les résultat sont consigné dans ce fichier [2] +[1] Energy consommée par le samsung lorsqu'on considère uniquement le cc_info. https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/Samsung_Gal_S8_energy_consumed_according_to_cpu_only_cc_info_variations.png +[2] fichier des résultats obtenus suite aux expés sur le samsung https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/raw_resut_and_powertool_stats_battery_fully_charged_cc_info.txt + + + + + + + + + + 4 - Donc demain je prévois + - effectuer les tests de variation de fréquence sur les configurations 2-1 et 1-2 si possible. + - rechercher le modèle du téléphone à acheter avec la bonne architecture et compatible lineage. + - rechercher le fichier relatif au chargeur dans le samsung. + - envisager de programmer les mesure pour le tests utilsant le cc_info + + + + - grab la zone en surplus sur le graphe de l'éval 1-1. Et soustraire sur les données. + - effectuer les tests de variation de fréquence sur les configurations 1-1, 3-0, 6-0 si possible. + - comparer les résultats du cc_info avec l'API + - parler à Vlad de l'idée de repartition des tâches sur plusieurs thread + - commender les banana cables + + + Salut Vlad, comme compte rendu d'aujourd'hui + 1 - sur le samsung, j'ai effectué le test que tu as suggéré, à savoir + - brancher le powermeter sur le téléphone en mode idle pendant 10 minutes + - et prendre des mesures à la fois sur le powermeter et sur le fichier cc_info. + Comme résultat + - Le powermeter alimente le téléphone de 90641.47 + - Le cc_info augmente de 74000 (start = 3660000 end = 3734000 , delta = 74000) + - ce qui suggère qu'en mode idle, le téléphone a tout de même consommé 16641.47. + - Ce qui avoisine les 15437.75 calculées en prenant en compte cc_info et le powermeter. + Les résultats sont consignés dans le fichier [1] + + Conclusion cc_info me semble fiable lorsqu'il est utilisé avec le powermeter, quelque soit les configurations car en mode idle cc_info seul ne suffit pas. + [1] fichier contenant les derniers résultats du samsung en considérant le fichier cc_info https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/raw_resut_and_powertool_stats_battery_fully_charged_cc_info.txt + + + 2 - Juste pour information, les résultats que nous avons avec le samsung en utilisant cc_info et le powermeter semblent cohérent avec l'estimation de leur API dumpsys battery stat. + - 17.2 pour la configuration 1-0, 59 pour la configuration 0-1, + - soit environs trois fois la configuration 1-0 + Conclusion l'API "dumpsys batterystat" de Lineage OS, semble avoir des soucis dans leur estimationsde l'énergie consommée. + 3 - Je prévois effectué les test que tu as demandé sur le Samsung la semaine prochaine. + Mais je me dis qu'il n'y aura pas de différence avec ceux déjà fait avec leur API. + [1] fichier contenant les derniers résultats du samsung en considérant le fichier cc_info https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/samsung_galaxy_s8/raw_resut_and_powertool_stats_battery_fully_charged_cc_info.txt + [2] Lien vers les anciens résultats estimée avec l'API dumpsys battery stats de samsung. https://drive.google.com/drive/folders/1TKK24Jq3Eb-GCJtPweW9RoImJrp2xl1Y + + 4 - J'ai aussi réalisé les expés que tu as suggéré hier, à savoir la configuration 1-1 + - d'une part avec les deux cores à la fréquence min et à la fréquence "half", 1m-1m et 1h-1h + - d'autre part avec uniquement le big core aux fréquence min et aux fréquence "half" , et 1-1m et 1-1h + Voici le graphe de résulats [3] + On peut remarquer que: + - de manière générale est beaucoup plus efficace en fixant les fréquences de deux cores à la fois. + - Je m'attendais à ce que la bonne configuration soit lorsque le little core est au max et le big au half, mais ce n'est pas le cas, c'est plutôt half-half. + Apparemment le fait que les deux sockets soit occupés influence l'efficacité du little qui devient efficace au half et non plus au max. + + Je peux encore tester 2-1 et 1-2 avec les configurations Min et halh des cores. pour valider cela + + [3] Ratio Energy/workload obtenu, avec les configuration supplémentaires 1m-1m et 1h-1h, 1-1m et 1-1h https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50.png + + 5- J'y ai aussi testé les configuration 3m-0, 3h-0 pour voir si la tendance que tu avais observé entre 1-0, 2-0 se vérifiait aussi sur 3-0 + En conclusion: + - la tendance s'observe aussi sur la configuration 3-O: lorsqu'on augmente le nombre de thread sur les littles Core en fixant la fréquence, + l'énergie consommée, ne varie pas beaucoup mais la workload calculée augmente grandement. + - Je me dis que ce serait une bonne idée de répartir le thread de la Best Effort sur le beaucoup de little core pour gagner en efficacité. + C'est une idée que j'émets au vu des résultats. + [3] Ratio Energy/workload obtenu, avec les configuration supplémentaires 3m-0, 3h-0 https://gitlab.liris.cnrs.fr/plwapet/power_tool_results/-/blob/main/google_pixel_4a_5g_varying_frequency/Google_pixel_ratio_energy_by_workload_according_to_cpu_charge_stop_level_50.png + + + + + + Bonjour Vlad, je viens déclarer la perte de quelques accessoire du powermonitor. + Ce sont les accessoire que l'on utilise au cas où le téléphone a été dépiécé. + Par conséquent, pour l'instant je ne les utilisais pas et je les avais mis + dans le carton d'achat de l'appareil et déposé dans le magasin de notre colocation. + Mais un des colocataire a dû jeter ce carton par inadvertance. + + Après ces connecteurs me semblent remplacable, donc au cas où on en aurait besoin, nous pouvons les acheter à nouveau [1]. + [1] nom de l'accessoire égaré : minigrabber to banana plug + https://www.google.com/search?q=minigrabber+to+banana+plug&client=firefox-b-d&sxsrf=ALiCzsZg4F5QtXtyw2beWn1IZJRCiiD3Sw%3A1651181225762&ei=qQZrYpyQLtaX9u8PsNyx0A8&oq=minigrabber+ba&gs_lcp=Cgdnd3Mtd2l6EAMYADIGCAAQFhAeOgcIABBHELADOgQIIxAnOgsILhDHARCjAhCRAjoLCC4QxwEQ0QMQkQI6CwguEIAEEMcBEKMCOgUIABCABDoICC4QgAQQ1AI6BQguEIAEOg4ILhDHARCjAhDUAhCRAjoHCCMQ6gIQJzoFCAAQkQI6DgguEMcBENEDENQCEJECOg4ILhCABBDHARCjAhDUAjoOCC4QgAQQxwEQrwEQ1AI6DgguEIAEEMcBENEDENQCOgsILhCABBDHARDRAzoFCAAQywE6CwguEMcBEK8BEMsBOgcIABAKEMsBOg0ILhDHARCvARAKEMsBOgcILhAKEMsBOggIABDJAxDLAToECAAQCjoECAAQHjoICAAQFhAKEB46BQghEKABSgQIQRgASgQIRhgAUL0JWKs9YPtHaAdwAXgBgAHJCYgBohmSAQo2LjEwLjEuNy0xmAEAoAEBsAEKyAEIwAEB&sclient=gws-wiz + + + + + + + + + + Shalom Kevin, + En plus d'avoir la foi au sacrifice et à la résurrection du Seigneur Jésus Christ qui par sa grâce accorde le salut de l'âme, + j'essaie du mieux que je peux de repecter la Loi du Dieu d'Israël y compris Deutéronome 6:13, Deutéronome 13:4, Deutéronome 7:26 et leur contexte. + Par conséquent si tu invoques dans tes prières une entité autre que l'Eternel, + je ne pourrais pas te laisser passer la nuit auprès de moi où j'habite pour l'instant. + + Salut Izedine, j'ai oublié de te dire quelque chose tout à l'heure. + En fait, il peut arriver que tu sonnes à la porte et que sois présent mais que je n'ouvre pas. + Il faudra alors comprendre que je suis vraiment très occupé, et je prie donc de m'excuser si cela arrive. + Mais si j'ai la possibilité d'ouvrir, j'ouvrirai. + C'est ce qu'il fallait que j'ajoute. + + Aussi tu t'es plein que je ne vous dis jamais "bon appetit" lorsque tu manges. + Toutes mes excuses si cela vous dérange. Je peux par contre dire "que le Seigneur Yéshoua bénisse votre repas". Accepterai tu que je te dise cela lorsque tu manges? + + + + + + + + + + + + + + + + Shalom mama, + Gloire soit rendue à Notre Père, Papa Yahweh pour cette demande de pardon que tu as effectuée. + Je prie afin que le Seigneur Jésus Christ te pardonne ce péché de détournement de budget. + Je partage aussi avec toi Deutéronomes 8:7-10 + Car Yahweh, ton Dieu, va te faire entrer dans un bon pays, pays de torrents, de sources et d’eaux profondes, qui jaillissent dans les vallées et les montagnes ; + pays de froment, d’orge, de vignes, de figuiers et de grenadiers ; pays d’oliviers, d’huile et de miel ; + pays où tu mangeras du pain en abondance, où tu ne manqueras de rien ; pays dont les pierres sont du fer, et des montagnes duquel tu tireras l’airain. + Tu mangeras et te rassasieras, et tu béniras Yahweh, ton Dieu, pour le bon pays qu’il t’a donné. + Bonne préparation de Shabbat. + Car Yahweh ton Dieu, t'introduira dans une terre bonne, terre de ruisseaux, de fontaines dans les champs et les montagnes de laquelle jaillissent les sources de fleuves. + + Une terre de blé, d'orge et de vignes; dans laquelle naissent les figuiers, les grenadiers et les oliviers; terre d'huile et de miel. + + Où tu mangeras ton pain sans en manquer jamais, où tu jouiras de toute chose. dont les pierres sont du fer et de ses montagnes on exploite des mines d'airain. + + Afin que lorsque tu auras mangé et que tu te seras rassasiée tu bénisse Yahweh ton Dieu, pour cette terre excellente qu'il t'a donné. + + + Shalom Kevin, je t'en prie, remercions l'Eternel pour cette grâce qu'il m'accorde de pouvoir te répondre. + Je te souhaite aussi un bon séjour sur Lyon si tu ne comptes plus passer à la colocation ne serait ce que mercredi. + Je te souhaite aussi une bonne journée dans la Paix du Seigneur Jésus Christ. + + Bonjour Vlad, désolé pour la latence, j'ai eu un imprévu. + Je crois t'avoir compris concernant l'expé sur le samsung en mode idle. + Je prévois l'effectuer tout à l'heure. + + + + \ No newline at end of file diff --git a/install_battery_drainer_app.sh b/install_battery_drainer_app.sh new file mode 100755 index 0000000..2893a6b --- /dev/null +++ b/install_battery_drainer_app.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +#APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\benchmarking_app_to_test_big_cores\app\debug\app-debug.apk" + APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\git_repositories\app_to_drain_battery.apk" +adb='/mnt/c/Program Files/Android/platform-tools_r33.0.1-windows/platform-tools/adb.exe' + +ls "$adb" + +"${adb}" root + +"$adb" shell "echo \"-----installing app" + + +"$adb" uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores + + +echo "---- before installing!!" +#"$adb" install /mnt/c/Users/lavoi/opportunist_task_on_android/benchmarking_app_to_test_big_cores/app/debug/app-debug.apk +"$adb" install "$APK_PATH__WINDOWS_SYNTAX" +echo "------ after installation" + +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS + +sleep 3 + +"$adb" shell "echo \"-----starting the app\" + sleep 1 + am start -n com.opportunistask.scheduling.benchmarking_app_to_test_big_cores/com.opportunistask.scheduling.benchmarking_app_to_test_big_cores.MainActivity" + sleep 1 +APP_PID=$("$adb" shell "ps -A | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') +echo "----- app_pid = $APP_PID " + + diff --git a/install_battery_drainer_app_for_non_rooted.sh b/install_battery_drainer_app_for_non_rooted.sh new file mode 100755 index 0000000..929a7fc --- /dev/null +++ b/install_battery_drainer_app_for_non_rooted.sh @@ -0,0 +1,35 @@ +#!/bin/bash + + +#APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\benchmarking_app_to_test_big_cores\app\debug\app-debug.apk" + APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\git_repositories\app_to_drain_battery_on_non_rooted_phone.apk" +adb='/mnt/c/Program Files/Android/platform-tools_r33.0.1-windows/platform-tools/adb.exe' + +ls "$adb" + +"${adb}" root + +"$adb" shell "echo \"-----installing app" + + +"$adb" uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores + + +echo "---- before installing!!" +#"$adb" install /mnt/c/Users/lavoi/opportunist_task_on_android/benchmarking_app_to_test_big_cores/app/debug/app-debug.apk +"$adb" install "$APK_PATH__WINDOWS_SYNTAX" +echo "------ after installation" + +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS + +sleep 3 + +"$adb" shell "echo \"-----starting the app\" + sleep 1 + am start -n com.opportunistask.scheduling.benchmarking_app_to_test_big_cores/com.opportunistask.scheduling.benchmarking_app_to_test_big_cores.MainActivity" + sleep 1 +APP_PID=$("$adb" shell "ps -A | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') +echo "----- app_pid = $APP_PID " + + diff --git a/install_battery_voltage_app.sh b/install_battery_voltage_app.sh old mode 100644 new mode 100755 diff --git a/install_benchmarking_app.sh b/install_benchmarking_app.sh old mode 100644 new mode 100755 index 5fb408b..be1ca4d --- a/install_benchmarking_app.sh +++ b/install_benchmarking_app.sh @@ -1,22 +1,35 @@ #!/bin/bash -adb root -adb shell "echo \"-----installing app" -adb uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores +#APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\benchmarking_app_to_test_big_cores\app\debug\app-debug.apk" + APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\git_repositories\benchmarking_app_to_test_big_cores\app\debug\app-debug.apk" +adb='/mnt/c/Program Files/Android/platform-tools_r33.0.1-windows/platform-tools/adb.exe' -adb install /home/patrick/opportunistic_tasks_android/Experiments_of_task_on_CPUs/benchmarking_app_to_test_big_cores/app/debug/app-debug.apk +ls "$adb" -adb shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP -adb shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS +"${adb}" root + +"$adb" shell "echo \"-----installing app" + + +"$adb" uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores + + +echo "---- before installing!!" +#"$adb" install /mnt/c/Users/lavoi/opportunist_task_on_android/benchmarking_app_to_test_big_cores/app/debug/app-debug.apk +"$adb" install "$APK_PATH__WINDOWS_SYNTAX" +echo "------ after installation" + +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP +"$adb" shell pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS sleep 3 -adb shell "echo \"-----starting the app\" +"$adb" shell "echo \"-----starting the app\" sleep 1 am start -n com.opportunistask.scheduling.benchmarking_app_to_test_big_cores/com.opportunistask.scheduling.benchmarking_app_to_test_big_cores.MainActivity" sleep 1 -APP_PID=$(adb shell "ps -A | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') +APP_PID=$("$adb" shell "ps -A | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') echo "----- app_pid = $APP_PID " diff --git a/install_benchmarking_app_and_add_it_to_cgroup.sh b/install_benchmarking_app_and_add_it_to_cgroup.sh old mode 100644 new mode 100755 diff --git a/install_benchmarking_app_on_samsung_galaxy_S8.sh b/install_benchmarking_app_on_samsung_galaxy_S8.sh old mode 100644 new mode 100755 index 063f3d4..4343b3d --- a/install_benchmarking_app_on_samsung_galaxy_S8.sh +++ b/install_benchmarking_app_on_samsung_galaxy_S8.sh @@ -1,22 +1,28 @@ #!/bin/bash -adb shell "echo \"-----installing app" -adb uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores + APK_PATH__WINDOWS_SYNTAX="C:\Users\lavoi\opportunist_task_on_android\git_repositories\benchmarking_app_to_test_big_cores\app\debug\app-debug.apk" +adb='/mnt/c/Program Files/Android/platform-tools_r33.0.1-windows/platform-tools/adb.exe' -adb install /home/patrick/opportunistic_tasks_android/Experiments_of_task_on_CPUs/benchmarking_app_to_test_big_cores/app/debug/app-debug.apk +ls "$adb" +"$adb" shell "echo \"-----installing app" -adb shell "su -c pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP" -adb shell "su -c pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS" +"$adb" uninstall com.opportunistask.scheduling.benchmarking_app_to_test_big_cores + +"$adb" install $APK_PATH__WINDOWS_SYNTAX + + +"$adb" shell "su -c pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.DUMP" +"$adb" shell "su -c pm grant com.opportunistask.scheduling.benchmarking_app_to_test_big_cores android.permission.PACKAGE_USAGE_STATS" sleep 3 -adb shell " echo \"-----starting the app\"; +"$adb" shell " echo \"-----starting the app\"; sleep 5; am start -n com.opportunistask.scheduling.benchmarking_app_to_test_big_cores/com.opportunistask.scheduling.benchmarking_app_to_test_big_cores.MainActivity" sleep 1 -APP_PID=$(adb shell "ps | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') +APP_PID=$("$adb" shell "ps | grep com.opportunistask.scheduling.benchmarking_app_to_test_big_cores" | awk '{ print $2 }') echo "----- app_pid = $APP_PID " #adb shell "am start -n com.opportunistask.scheduling.benchmarking_app_to_test_big_cores/com.opportunistask.scheduling.benchmarking_app_to_test_big_cores.MainActivity" diff --git a/install_benchmarking_app_on_sony_xperia.sh b/install_benchmarking_app_on_sony_xperia.sh old mode 100644 new mode 100755 diff --git a/install_interactive_benchmarking_app.sh b/install_interactive_benchmarking_app.sh old mode 100644 new mode 100755 diff --git a/install_interactive_benchmarking_app_on_samsung_galaxy_S8.sh b/install_interactive_benchmarking_app_on_samsung_galaxy_S8.sh old mode 100644 new mode 100755 diff --git a/mini_shell_to_restart_app_on_SamsungS8.sh b/mini_shell_to_restart_app_on_SamsungS8.sh old mode 100644 new mode 100755 diff --git a/project_presentation.odp b/project_presentation.odp new file mode 100755 index 0000000000000000000000000000000000000000..19d5cf2664e99f34cd626badeeb7b9fb8ccc347f GIT binary patch literal 35931 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 literal 0 HcmV?d00001 diff --git a/remove_fl_task_from_fl_group.sh b/remove_fl_task_from_fl_group.sh old mode 100644 new mode 100755 diff --git a/research_problem_overview.graphml b/research_problem_overview.graphml new file mode 100755 index 0000000..2deb1d9 --- /dev/null +++ b/research_problem_overview.graphml @@ -0,0 +1,210 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<graphml xmlns="http://graphml.graphdrawing.org/xmlns" xmlns:java="http://www.yworks.com/xml/yfiles-common/1.0/java" xmlns:sys="http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0" xmlns:x="http://www.yworks.com/xml/yfiles-common/markup/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:y="http://www.yworks.com/xml/graphml" xmlns:yed="http://www.yworks.com/xml/yed/3" xsi:schemaLocation="http://graphml.graphdrawing.org/xmlns http://www.yworks.com/xml/schema/graphml/1.1/ygraphml.xsd"> + <!--Created by yEd 3.22--> + <key attr.name="Description" attr.type="string" for="graph" id="d0"/> + <key for="port" id="d1" yfiles.type="portgraphics"/> + <key for="port" id="d2" yfiles.type="portgeometry"/> + <key for="port" id="d3" yfiles.type="portuserdata"/> + <key attr.name="url" attr.type="string" for="node" id="d4"/> + <key attr.name="description" attr.type="string" for="node" id="d5"/> + <key for="node" id="d6" yfiles.type="nodegraphics"/> + <key for="graphml" id="d7" yfiles.type="resources"/> + <key attr.name="url" attr.type="string" for="edge" id="d8"/> + <key attr.name="description" attr.type="string" for="edge" id="d9"/> + <key for="edge" id="d10" yfiles.type="edgegraphics"/> + <graph edgedefault="directed" id="G"> + <data key="d0"/> + <node id="n0"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="37.0" width="178.0" x="323.0" y="161.0"/> + <y:Fill color="#E7DFBE" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="87.0" y="16.5"> + <y:LabelModel> + <y:SmartNodeLabelModel distance="4.0"/> + </y:LabelModel> + <y:ModelParameter> + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> + </y:ModelParameter> + </y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n1"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="72.0" width="20.0" x="1135.0" y="181.0"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="133.427734375" x="-56.7138671875" xml:space="preserve" y="26.6494140625">Federated Learning App<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n2"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="72.0" width="20.0" x="402.0" y="143.5"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="133.427734375" x="-56.7138671875" xml:space="preserve" y="26.6494140625">Federated Learning App<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n3"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="37.0" width="221.0" x="328.0" y="315.0"/> + <y:Fill color="#DDD3A4" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="108.5" y="16.5"> + <y:LabelModel> + <y:SmartNodeLabelModel distance="4.0"/> + </y:LabelModel> + <y:ModelParameter> + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> + </y:ModelParameter> + </y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n4"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="127.0" width="15.0" x="380.0" y="273.5"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="81.37890625" x="-33.189453125" xml:space="preserve" y="54.1494140625">Android kernel<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n5"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="30.0" width="30.0" x="293.0" y="241.0"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0"> + <y:LabelModel> + <y:SmartNodeLabelModel distance="4.0"/> + </y:LabelModel> + <y:ModelParameter> + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> + </y:ModelParameter> + </y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n6"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="30.0" width="30.0" x="747.0" y="245.0"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle color="#000000" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="13.0" y="13.0"> + <y:LabelModel> + <y:SmartNodeLabelModel distance="4.0"/> + </y:LabelModel> + <y:ModelParameter> + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> + </y:ModelParameter> + </y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n7"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="72.0" width="20.0" x="687.0" y="206.0"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="64.69140625" x="-22.345703125" xml:space="preserve" y="26.6494140625">User space<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n8"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="42.0" width="299.0" x="328.0" y="434.0"/> + <y:Fill color="#CFBC66" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" hasText="false" height="4.0" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="4.0" x="147.5" y="19.0"> + <y:LabelModel> + <y:SmartNodeLabelModel distance="4.0"/> + </y:LabelModel> + <y:ModelParameter> + <y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/> + </y:ModelParameter> + </y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n9"> + <data key="d5"/> + <data key="d6"> + <y:ShapeNode> + <y:Geometry height="127.0" width="15.0" x="395.0" y="389.0"/> + <y:Fill hasColor="false" transparent="false"/> + <y:BorderStyle hasColor="false" raised="false" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="131.40625" x="-58.203125" xml:space="preserve" y="54.1494140625">Mobile phone Hardware<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + <y:Shape type="rectangle"/> + </y:ShapeNode> + </data> + </node> + <node id="n10"> + <data key="d4" xml:space="preserve"/> + <data key="d5"/> + <data key="d6"> + <y:UMLNoteNode> + <y:Geometry height="21.0" width="126.0" x="487.0" y="206.0"/> + <y:Fill color="#CCCCCC" transparent="false"/> + <y:BorderStyle color="#000000" type="line" width="1.0"/> + <y:NodeLabel alignment="center" autoSizePolicy="content" fontFamily="Dialog" fontSize="12" fontStyle="plain" hasBackgroundColor="false" hasLineColor="false" height="18.701171875" horizontalTextPosition="center" iconTextGap="4" modelName="custom" textColor="#000000" verticalTextPosition="bottom" visible="true" width="103.380859375" x="11.3095703125" xml:space="preserve" y="1.1494140625">Number of threads<y:LabelModel><y:SmartNodeLabelModel distance="4.0"/></y:LabelModel><y:ModelParameter><y:SmartNodeLabelModelParameter labelRatioX="0.0" labelRatioY="0.0" nodeRatioX="0.0" nodeRatioY="0.0" offsetX="0.0" offsetY="0.0" upX="0.0" upY="-1.0"/></y:ModelParameter></y:NodeLabel> + </y:UMLNoteNode> + </data> + </node> + <edge id="e0" source="n5" target="n6"> + <data key="d9"/> + <data key="d10"> + <y:PolyLineEdge> + <y:Path sx="0.0" sy="0.0" tx="0.0" ty="0.0"/> + <y:LineStyle color="#000000" type="dashed" width="1.0"/> + <y:Arrows source="none" target="none"/> + <y:BendStyle smoothed="false"/> + </y:PolyLineEdge> + </data> + </edge> + <edge id="e1" source="n0" target="n3"> + <data key="d9"/> + <data key="d10"> + <y:PolyLineEdge> + <y:Path sx="69.0" sy="8.5" tx="42.5" ty="-1.5"/> + <y:LineStyle color="#000000" type="line" width="1.0"/> + <y:Arrows source="none" target="standard"/> + <y:BendStyle smoothed="false"/> + </y:PolyLineEdge> + </data> + </edge> + </graph> + <data key="d7"> + <y:Resources/> + </data> +</graphml> -- GitLab