вторник, 31 марта 2020 г.

SDN

SDN, OpenFlow (wiki, habr):
1) Программно-определяемая сеть (на английском SDN)
2) OpenFlow
3) OpenFlow SDN
4) Эволюция в сетях Дата-Центров. Программно-определяемые сети SDN 


Reconfigurable Match-action Table (RMT):
1) dRMT: Disaggregated Programmable Switching (to print)
2) Forwarding Metamorphosis: Fast Programmable Match-Action Processing in Hardware for SDN
https://www2.cs.duke.edu/courses/fall19/compsci514/papers/rmt-sigcomm2013.pdf (to print)
3) https://www.coursera.org/learn/sdn/lecture/1sk09/programmable-chipsets-rmt
4) https://en.wikipedia.org/wiki/P4_(programming_language)

MPLS traffic engineering (wiki, habr):
1) MPLS
2) https://www.youtube.com/watch?v=cQ9Qe1dJFl4
3) https://habr.com/ru/post/246425/
4) https://habr.com/ru/post/338578/
5) wfq https://www.opengl.org.ru/postroenie-virtualnykh-chastnykh-setei/weighted-fair-queuing-wfq.html

Вики (реализация в "железе"):
1) https://en.wikipedia.org/wiki/Network_search_engine
2) https://en.wikipedia.org/wiki/Network_processor
3) https://en.wikipedia.org/wiki/Application-specific_integrated_circuit
4) https://en.wikipedia.org/wiki/Content-addressable_memory (в русской вики "Ассоциативная память")

Книги, статьи (реализация в "железе"):
1) Семья Олифер - Компьютерные сети
2) Weirong Jiang, Viktor K. Prasanna - Towards Practial Architectures for SRAM-based Pipelined Lookup Engines (to print)

NIC (сетевая карта, сетевой адаптер):
1) Brent Stephens, Aditya Akella, Michael M. Swift - Your Programmable NIC Should be a Programmable Switch https://yadi.sk/i/7P4B5zZ0QHwo3Q
2) Alex Forencich, Alex C. Snoeren, George Porter, George Papen - Corundum: An Open-Source 100-Gbps NIC https://cseweb.ucsd.edu/~snoeren/papers/corundum-fccm20.pdf
2) https://ru.wikipedia.org/wiki/TCP_Offload_Engine
3) https://en.wikipedia.org/wiki/Line_card

OpenVSwitch:
1) https://www.openvswitch.org/
2) https://ru.wikipedia.org/wiki/Open_vSwitch
3) https://github.com/openvswitch/ovs
4) https://habr.com/ru/post/467801/

OpenVSwitch (настройка):
1) Open vSwitch как ядро виртуальной сети
2) Разделяй и властвуй. Используем Open vSwitch для разделения виртуалок между VLAN
3) http://xgu.ru/wiki/Open_vSwitch
4) Замена стандартного Linux Bridge на Open vSwitch
5) https://ivirt-it.ru/open-vswitch-create-switch/
6) http://vladimir-stupin.blogspot.com/2016/06/open-vswitch-debian.html
7) http://fedoraway.blogspot.com/2017/03/openvswich-kvm-vlan.html

Математическая статистика

Процентиль, квантиль:
3) Человеческим языком про метрики 3: перцентили для чайников https://habr.com/ru/companies/tochka/articles/690814/

Математическая статистика:
1) Случайный процесс
2) Случайная величина

Распределение Бернулли:

Распределение Пуассона:
3) распределение пуассона часть 1 https://www.youtube.com/watch?v=rfznj8Woc5I

Биномиальное распределение:

Распределение Гаусса:

Распределение Лапласа:


QoS, scheduling:
7) https://en.wikipedia.org/wiki/Traffic_shaping
8) Теория телетрафика (https://en.wikipedia.org/wiki/Teletraffic_engineering)
9) https://en.wikipedia.org/wiki/Traffic_flow_(computer_networking)
10) Моделирование трафика (https://en.wikipedia.org/wiki/Traffic_generation_model)
11) https://ru.wikipedia.org/wiki/FIFO
12) Round-robin (на английском)
13) https://en.wikipedia.org/wiki/Network_scheduler (приведен список алгоритмов шедулинга пакетов)
14) https://en.wikipedia.org/wiki/Packet_switching
15) https://ru.wikipedia.org/wiki/LIFO
16) https://en.wikipedia.org/wiki/Weighted_round_robin
17) https://en.wikipedia.org/wiki/Deficit_round_robin
18) https://en.wikipedia.org/wiki/Work-conserving_scheduler
19) https://en.wikipedia.org/wiki/Virtual_output_queueing
20) https://en.wikipedia.org/wiki/Head-of-line_blocking
23) https://en.wikipedia.org/wiki/Generalized_processor_sharing

Алгоритмы на транспортной сети:
1) https://en.wikipedia.org/wiki/Matching_(graph_theory) (на русском Паросочетание)
2) Двудольный граф
3) https://en.wikipedia.org/wiki/Maximum_cardinality_matching (MSM)
4) https://en.wikipedia.org/wiki/Maximum_weight_matching (MWM)
5) Транспортная сеть (https://en.wikipedia.org/wiki/Flow_network)
6) Задача о максимальном потоке
7) https://en.wikipedia.org/wiki/Flow_graph_(mathematics)
8) https://en.wikipedia.org/wiki/Traffic_flow

Network scheduler algorithms (articles):
1) Tiny Tera: a packet switch core (VOQ)
2) A Practical Scheduling Algorithm to Achieve100% Throughput in Input-Queued Switches
3) Input-queued switches: Scheduling algorithms for a crossbarswitch (слайды)
4) Analysis of scheduling algorithms that provide 100% throughput in input-queued switches
Wfq implementation:
1) Взвешенная справедливая очередь (русская вики, есть описание хода алгоритма WFQ) ( английская вики WFQ)
2) Описание хода алгоритма WFQ
http://www.mathcs.emory.edu/~cheung/Courses/558/Syllabus/11-Fairness/WFQ.html
3) Abhay K. Parekh and Robert G. Gallager A Generalized Processor Sharing Approach to Flow Control in Integrated Services Networks: The Single-Node Case http://www.cs.columbia.edu/~ricardo/misc/docs/gps.pdf (первое описание алгоритма wfq, если верить http://www.mathcs.emory.edu/~cheung/Courses/558/Syllabus/11-Fairness/WFQ.html)
4) Пример реализации wpq проекте gini
5) https://github.com/Bluefissure/WFQ-Algorithm-in-QoS-Queue-Scheduler
6) Kenji Yoshigoe and Kenneth J. Christensen - An Evolution to Crossbar Switches with Virtual Output Queuing and Buffered Cross Points
https://www.researchgate.net/publication/3282919_An_Evolution_to_Crossbar_Switches_with_Virtual_Output_Queuing_and_Buffered_Cross_Points
7) Nick McKeown, Adisak Mekkittikul, Venkat Anantharam, Jean Walrand - Achieving 100% Throughput in an InputQueued Switch
http://yuba.stanford.edu/~nickm/papers/IEEE_COMM_V3.pdf
8) Sang-Ho Lee, Dong-Ryeol Shin, Hee Yong Youn  - Weighted Fair Scheduling Algorithm for QoS of Input-Queued Switches https://link.springer.com/chapter/10.1007/978-3-540-30141-7_51 (есть описание алгоритмов WFQ)

Pifo implementation:
1) Programmable Packet Scheduling at line rate http://web.mit.edu/pifo/
2) C++ code for reference model of the PIFO hardware
https://github.com/programmable-scheduling/pifo-machine
3) Verilog code for PIFO hardware design
https://github.com/programmable-scheduling/pifo-hardware
4) A. Demers, S. Keshav, and S. Shenker. Analysis and Simulation of a Fair Queueing Algorithm
http://ccr.sigcomm.org/archive/1995/jan95/ccr-9501-shenker.pdf
5) J. C. R. Bennett and H. Zhang. Hierarchical Packet FairQueueing Algorithms
https://www.cs.cmu.edu/~hzhang/papers/TON-97-Oct.pdf
6) M. Shreedhar and G. Varghese. Efficient Fair Queuing using Deficit Round Robin
http://pages.cs.wisc.edu/~akella/CS740/S07/740-Papers/SV95.pdf
7) P. Goyal, H. M. Vin, and H. Chen. Start-time Fair Queueing: A Scheduling Algorithm for Integrated Services Packet Switching Networks
http://ccr.sigcomm.org/archive/1996/papers/goyal.pdf
8) P. McKenney. Stochastic Fairness Queuing
http://www2.rdrop.com/~paulmck/scalability/paper/sfq.2002.06.04.pdf

Задача поиска максимального паросочетания:
1) http://math.nsc.ru/LBRT/k4/LOR/lor_Theme6.pdf (лекционный курс)
2) Алгоритм Форда-Фалкерсона (вики)
3) http://acm.mipt.ru/twiki/bin/view/Algorithms/BipartiteMatchingCPP (реализация)
4) Алгоритм Форда-Фалкерсона для поиска максимального паросочетания (реализация)
5) http://algolist.ru/maths/graphs/maxflows/Ford_Fulkerson.php
6) https://www.youtube.com/watch?v=u9NigdVHUr0
7) https://www.youtube.com/watch?v=aDaiFQp9Ugo (паросочетания двудольного графа)
8) https://e-maxx.ru/algo/kuhn_matching

Maple:
1) графы в maple http://eqworld.ipmnet.ru/ru/library/books/Kirsanov2007ru.pdf (программы)
2) maple trial https://www.maplesoft.com/products/maple/free-trial/?IC=10355

IP packet:
1) https://ru.wikipedia.org/wiki/IP (на английском https://en.wikipedia.org/wiki/IPv4#Packet_structure)
2) https://en.wikipedia.org/wiki/Protocol_data_unit
3) Битовое поле

пятница, 27 марта 2020 г.

Измерение времени выполнения кода с помощью rdtsc, rdtscp

1. rdtsc

Начиная с gcc 4.5 функция __rdtsc() определена под MSVC и под GCC, надо только в коде включить разные хэдэры:

#if defined(_WIN32) 
#include <intrin.h>
#endif

#if !defined(_WIN32) 
#include <x86intrin.h> 
#endif

До gcc 4.5 можно запилить следующее определение функции rdtsc для windows и linux:

//! windows
#if defined(_WIN32)
#include <intrin.h>uint64_t rdtsc(){ 
  return __rdtsc();
}

#endif

//! linux
#if !
defined(_WIN32) 

uint64_t ull rdtsc() {
  unsigned int lo, hi;
  asm volatile ( "rdtsc" : "=a" (lo), "=d" (hi) );
  return ((uint64_t)hi << 32) | lo;
}

#endif

Ссылки:
1) https://ru.wikipedia.org/wiki/Rdtsc
2) Максимально точное измерение кода https://habr.com/ru/post/147852/
3) Измерение кода с наносекундной точностью https://habr.com/ru/post/425237/
4) Оптимизация длинной арифметики на C++ https://habr.com/ru/post/135590/
5) (!) https://stackoverflow.com/questions/13772567/how-to-get-the-cpu-cycle-count-in-x86-64-from-c
6) https://stackoverflow.com/questions/9887839/how-to-count-clock-cycles-with-rdtsc-in-gcc-x86
7) https://stackoverflow.com/questions/19941588/negative-clock-cycle-measurements-with-back-to-back-rdtsc
8) (!) https://stackoverflow.com/questions/51818655/clflush-to-invalidate-cache-line-via-c-function/
9) http://www.mkurnosov.net/uploads/Main/mkurnosov-rdtsc-2014.pdf
10) Примеры https://ru.wikibooks.org/

asm rdtsc:
1) https://c9x.me/x86/html/file_module_x86_id_278.html
2) https://www.felixcloutier.com/x86/rdtsc
3) http://www.club155.ru/x86cmd/RDTSC

2. rdtsp:

Ссылки:
1) https://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf
2) https://stackoverflow.com/questions/12631856/difference-between-rdtscp-rdtsc-memory-and-cpuid-rdtsc

asm rdtsp:
1) https://www.felixcloutier.com/x86/rdtscp

3. out-of-order code execution:
1) Внеочередное исполнение (английская статья)
2) Lecture 14 - Out-of-Order Execution - Carnegie Mellon - Computer Architecture 2013 - Onur Mutlu https://www.youtube.com/watch?v=LU2W-YtyeEo
3) Out of Order Load Store Execution - Georgia Tech - HPCA: Part 3
https://www.youtube.com/watch?v=WC5Bo9UdI2w

4. lfence

Ссылки:
1) Барьер памяти
2) https://stackoverflow.com/questions/7346893/out-of-order-execution-and-memory-fences

asm lfence:
1) https://www.felixcloutier.com/x86/lfence
2) https://c9x.me/x86/html/file_module_x86_id_155.html

5. cpuid

Ссылки:
1) https://ru.wikipedia.org/wiki/CPUID
2) https://stackoverflow.com/questions/32662518/cpuid-rdtsc-and-out-of-order-execution

6. tsc frequency

Links:
1) https://stackoverflow.com/questions/51919219/determine-tsc-frequency-on-linux

7. CPUID features relevant to the TSC

Links:
1) https://stackoverflow.com/questions/13772567/how-to-get-the-cpu-cycle-count-in-x86-64-from-c
2) https://unix.stackexchange.com/questions/43539/what-do-the-flags-in-proc-cpuinfo-mean

8. calc tsc freq by call usleep, nanosleep, delay in asm and rdtscp

Links:
1) https://stackoverflow.com/questions/10921210/cpu-tsc-fetch-operation-especially-in-multicore-multi-processor-environment
2) https://stackoverflow.com/questions/3830883/cpu-cycle-count-based-profiling-in-c-c-linux-x86-64
3) https://stackoverflow.com/questions/2814569/calculating-cpu-frequency-in-c-with-rdtsc-always-returns-0
4) https://stackoverflow.com/questions/12777254/time-delay-in-c-usleep/12777296
5) https://linux.die.net/man/3/usleep
6) https://stackoverflow.com/questions/7684359/how-to-use-nanosleep-in-c-what-are-tim-tv-sec-and-tim-tv-nsec
7) https://man7.org/linux/man-pages/man2/nanosleep.2.html
8) https://stackoverflow.com/questions/15201955/how-to-set-1-second-time-delay-at-assembly-language-8086
9) https://stackoverflow.com/questions/19580282/nasm-assembly-linux-timer-or-sleep/19580595#19580595


9. getting cpu frequency (rate) to produce nanoseconds from ticks

9.1. Можно получить текущую частоту процессорных ядер по отдельности при помощи следующей команды:

cat /proc/cpuinfo | grep "MHz"

Или так (вместо * можно написать номер ядра):

sudo cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_cur_freq

Или так без sudo:

cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

9.2. Общую частоту можно получить так:

lscpu | grep MHz

Или так:

sudo dmidecode -t processor | grep Speed

Ссылки:
1) https://stackoverflow.com/questions/35123379/getting-tsc-rate-in-x86-kernel
2) https://www.systutorials.com/measuring-time-accurately-in-programs/
3) https://en.wikipedia.org/wiki/Time_Stamp_Counter
4) (!) https://askubuntu.com/questions/218567/any-way-to-check-the-clock-speed-of-my-processor
5) https://unix.stackexchange.com/questions/264632/what-is-the-correct-way-to-view-your-cpu-speed-on-linux
6) http://btorpey.github.io/blog/2014/02/18/clock-sources-in-linux/
7) not using rdtsc https://stackoverflow.com/questions/5248915/execution-time-of-c-program
8) (!) https://stackoverflow.com/questions/42189976/calculate-system-time-using-rdtsc
9) https://ru.wikipedia.org/wiki/Skylake

Cash misses:


Некоторая статистика по микропроцессорам, частоте и предельным таймерам:

1) SoC BBB - микроконтроллер TI AM3358 - микроархитектура ARM Cortex-A8 - частота 1 ГГц = 10^9 Гц - регистры 32 бит. Предельный идеальный таймер  - с размерностью 32 бит и точностью 1 / 10^9 = 1 наносекунда.

2) SoC Raspberry Pi 3B - микроконтроллер Broadcom BCM 2837 - микроархитектура ARM Cortex-A53 - частота 1.2 ГГц - регистры 64 бит. Предельный идеальный таймер  - с размерностью 64 бит и точностью 1 / 10^9 = 1 наносекунда.

3) SoC STM32 "BluePill" - микроконтроллер STM32f103 - микроархитектура ARM Cortex M3  - частота 32 МГц - регистры 32 бит. Предельный идеальный таймер  - с размерностью 32 бит и точностью 1 / 10^6 = 1 микросекунда.

4) SoC STM32 f429 Discovery - микроконтроллер STM32f429 - микроархитектура ARM Cortex M4  - частота 180 МГц - регистры 32 бит. Предельный идеальный таймер  - с размерностью 32 бит и точностью 1 / 10^6 = 1 микросекунда.

5) Микропроцессор Intel Core i5 520m - микроархитектура Westmere - частота 2.4 ГГц - регистры 64 бит. Предельный идеальный таймер  - с размерностью 64 бит и точностью 1 / 10^9 = 1 наносекунда.

High Resolution Timer In Linux (links):
1) https://elinux.org/High_Resolution_Timers
2) https://www.kernel.org/doc/Documentation/timers/hrtimers.txt
3) https://stackoverflow.com/questions/6749621/how-to-create-a-high-resolution-timer-in-linux-to-measure-program-performance
4) https://forum.qt.io/topic/31369/high-resolution-timer
5) https://stackoverflow.com/questions/15730765/qt-high-resolution-timer

6) Методы измерения кода помимо rdtsc https://habr.com/ru/post/282301/
7) Оптимизация кода для эльбрусов https://habr.com/ru/company/smartengines/blog/317672/

Вики разных единиц измерения скорости вычисления операций процами:
1) https://en.wikipedia.org/wiki/Instructions_per_second
2) https://en.wikipedia.org/wiki/Instructions_per_cycle
3) https://en.wikipedia.org/wiki/Cycle_per_second
4) https://en.wikipedia.org/wiki/Cycles_per_instruction
5) https://en.wikipedia.org/wiki/Normalized_frequency_(unit)
6) https://en.wikipedia.org/wiki/Heinrich_Hertz

четверг, 26 марта 2020 г.

Использование git

С hg я не использую консольные команды, обычные задачи покрываются графической оболочкой TortoiseHg на Fedora 31 и Windows 10. Описание значков интерфейса здесь.

На windows 10 для работы с git я использую Git for Windows, другие графические среды (например, SmartGit, SourceTree, TortoiseGit) перечислены здесь. Сейчас (13.01.2023) использую под виндой TortoiseGit, он по функциональности близок к TortoiseHg (на момент написания статьи (27.03.2020) был косячный). Под линукс планирую использовать простую консоль.

tortoisegit + github:

5) Git Pull using Tortoise Git Tool https://www.youtube.com/watch?v=ZyMTeeG6zEE
6) W0 - clone push and pull using Tortoise Git https://www.youtube.com/watch?v=tbcAuZQ0MAA

github:
1) How to push git repo from Windows 10 CMD https://www.youtube.com/watch?v=ZPDnCfMhbA8

Команды для bash:

1) Создаем новый репозитарий в текущей папке. Например, у меня в Windows Git Bash в текущей папке /c/Projects/Makefile/MyTestQtProject уже есть папка с qt-проектом:

cd /c/Projects/Makefile/MyTestQtProject
git init

В результате в папке /c/Projects/Makefile/MyTestQtProject создается подпапка .git с репозитарием.

2) Добавляем отдельные файлы из проекта под вирсионный контроль:

git add main.cpp

Удаляем неправильно поставленные файлы с версионного контроля (например, файлы проекта, которые у каждого разработчика могут быть свои):

git rm --cached myproject.pro

3) Смотрим статус по добавленным в репозитарий (changes to be commited) файлам, ненаходящимся под версионным контролем (untracked):

git status

4) Создаем файл исключений .gitignore (как .hgignore), дальше приводится содержимое для qt-проекта:

syntax: glob

*.user*
*~
ui_*
moc_*
.fuse*
.qmake*

*.o
*.pdb

Makefile*
MyTestQtProject

debug
release

5) Коммитим изменения:

git commit

После ввода откроется выбранный текстовый редактор (под виндой удобно поставить notepad++, под линукс по умолчанию ставится vim). После ввода надо сохранить изменения (самый простой способ записать изменения в vim - нажать клавишу "escape" и набрать "wq" (сохранить изменения и выйти)).

Можно сразу ввести коммит с меткой:

git commit -m "start"

6) При последующих коммитах, если изменения касаются только уже добавленных на версионный контроль файлов, коммитить можно следующим образом:

git commit -a -m "continue"

7) Для работы из строки надо представиться системе:

git config --global user.email "you@example.com"
git config --global user.name "Your Name"

8) Создаем на gitlab-е через web-интерфейс проект, получаем путь к проекту вида git@git.medteco.ru:username/gitrepo. Коммитим существующий локальный репозитарий:

git remote add origin <ssh-репозитарий gitlab>
git push -u origin master

9) Получаем изменения с удаленного сервера (origin):

9.1) Получаем изменения с удаленного сервера gitlab (origin):

git remote add origin <ssh-репозитарий gitlab>
git pull origin master

https://githowto.com/pulling_changes

9.2) Получаем изменения из соседней папки (origin):

git remote add origin /d/Projects/ti/git/tda3_ccs831
git pull origin master

Удаляем:
git remote remove origin

https://komodor.com/learn/how-to-fix-fatal-remote-origin-already-exists-error/

10) Клонируем существующий репозитарий на gitlab'е в текущую папку:

git clone <ssh-репозитарий gitlab>

git clone https://192.168.73.30/devs/devs/gen3

11) Восстанавливаем файлы из локального репозитария ("откатываем" изменения до последнего коммита):

git restore .

12) Переключаемся на нужный коммит:

git checkout <хэш коммита>

Для переключения на последний коммит в ветке master:

git checkout master

13) Создаем новую ветку develop для коммита cca1cd03bb4a5bf3077681beff9899bda770e19e:

git branch develop cca1cd03bb4a5bf3077681beff9899bda770e19e

Чтобы слить изменения в ветке с master:
git checkout master
git merge develop

https://stackoverflow.com/questions/8953206/how-do-i-move-my-commits-from-no-branch-to-an-actual-branch

14) Переключаемся на ветку develop:

git switch develop

14.1) Затянуть изменения из внешнего хранилища и смерджить с содержимым ветки:

git pull (origin master)
git branch --set-upstream-to=origin/master develop
git merge


15) Отобразить список доступных веток:

git branch --list

16) git log:

Сложный вывод с показом ветвлений:
git log --pretty=format:"%h - %an, %ar : %s"

Последние 2 коммита:
git log -2

16) Удаляем из ещё незакомиченного кэша (но уже выполнен git add) бинарные ненужные для версионного контроля файлы (вроде *.o, *.obj или целая папка в студии Debug), которые почему-то вовремя не оказались в .gitignore:
git rm -r --cached test_client/Release/*

17) git diff не работает по текстовым файлам UTF-16, которые по умолчанию формирует VS2017;

18) Подключаемся к новому удаленному репозитарию с созданным проектом, переключаемся на ветку master, заливаем в него файлы только ветки master, коммиты, бранчи, а потом все ветки активного проекта:
git remote add origin <https-git-репозитарий>
git branch -M master
git push -u origin master
git push --all

git push --set-upstream <remote-name> <localbranch>

Workaround:


Ссылки (hg):
1) Hg Init: Часть 2. Основы Mercurial https://habr.com/ru/post/108658/
2) https://habr.com/ru/post/274877/

Ссылки (git):
1) основные консольные команды https://habr.com/ru/post/336708/ (!)
2) hgignore https://git-scm.com/docs/gitignore
2) hg commit

Ссылки (обзор git):
1) https://habr.com/ru/company/playrix/blog/345732/
2) https://habr.com/ru/post/437000/
3) https://habr.com/ru/post/472600/
4) https://habr.com/ru/post/342116/
5) https://habr.com/ru/post/440816/
6) https://habr.com/ru/post/174467/
7) https://habr.com/ru/post/125799/

Useful:
1) Переход с Mercurial на GIT в Atlassian Bitbucket с сохранением файлов в кириллице

git branch:

вторник, 24 марта 2020 г.

Установка Fedora 31 ноут с технологией nvidia optimus и переключение между двумя видеокартами в ноуте asus n61jv

В ноуте asus n61jv используется внешняя видеокарта Nvidia GeForce GT 325 M, которая работает совместно со встроенной в ядро процессора core i3. Технология Nvidia Optimus оставляет за ядром GPU NVidia выбор того, какую из двух карт использовать в данный момент. Встроенная работает с нетребовательными к ресурсам приложениями, внешняя - со всеми остальными. Переключение через BIOS, в данном случае, невозможно, так как в нем (AMI BIOS) в конкретной модели нет такой опции IGD/PEG.

1. Windows 10. В винде есть возможность переключиться через специальное приложение от разработчика соответствующей видеокарты.

2. Fedora 31. В линуксе раньше не было такого приложения от разработчика, потом появился проект switchero (ноут asus n61jv - в списке поддерживаемых). Затем появился проект NVIDIA Optimus Bumblebee, в последней федоре он предустановлен по умолчанию.

При старте установки с liveusb-флешки с включенной в биосе uefi-mode установка сразу зависала. После выключения uefi-mode в биосе и установки флешки в верх приоритетного списка, загрузка пошла, но после сообщения "started gnome display manager" показался курсор и больше ничего. В dmesg ошибки nouveau drivers. Это происходит из-за конфликта между картами. Лечится редактирование стартовых параметров в грубе на liveusb, войти в редактирование конкретной строки запуска можно нажав "Tab". Надо добавить следующий параметр в конец через пробел nomodeset (решение отсюда). Теперь liveusb-система запускается, ставим.

Добавляем free и non-free репозитарии rpm-fusion:

sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm

Устанавливаем последние драйверы nvidia и включаем поддержку cuda:

sudo dnf install akmod-nvidia
sudo dnf install xorg-x11-drv-nvidia-cuda #optional for cuda/nvdec/nvenc support

После установки пакетов в файле /etc/default/grub у меня прописано:

GRUB_CMDLINE_LINUX="rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1 ... nomodeset ..."

akmod - это специальный модуль ядра; убедиться, что он собран и подключен можно командой:

modinfo -F version nvidia

У меня выдает 440.82.

Но при этом стандартная загрузка с использование видеокарты nvidia не идет. И у меня в такой конфигурации система показывает опять только курсор и больше ничего. При загрузке появляются сообщения логера:

Started Builds and install new kmods from akmod packages
Starting Fallback to nouveau as nvidia did not load

Работает загрузка с использование стандартного драйвера nouveau. Для этого на этапе выбора пункта grub для загрузки надо удалить следующую часть команд загрузки:

rd.driver.blacklist=nouveau modprobe.blacklist=nouveau nvidia-drm.modeset=1

И добавить "nomodeset". В этом случае загрузка идет. 

Определим видеокарту:

/sbin/lspci | grep -e VGA
/sbin/lspci | grep -e 3D



nvidia driver:
1) (!) https://rpmfusion.org/Howto/NVIDIA
2) http://us.download.nvidia.com/XFree86/Linux-x86/367.57/README/supportedchips.html
2) https://rpmfusion.org/Howto/Optimus
3) https://rpmfusion.org/Configuration
4) (!) https://russianfedora.github.io/FAQ/hardware.html
5) Как в Linux взламывать пароли видеокартой и центральным процессором https://hackware.ru/?p=12264

bugs:
2) https://docs.fedoraproject.org/en-US/fedora/rawhide/system-administrators-guide/kernel-module-driver-configuration/Working_with_the_GRUB_2_Boot_Loader/
3) https://www.reddit.com/r/Fedora/comments/duo0de/nvidia_optimus_on_fedora_31/
4) https://www.easycoding.org/2017/01/11/pravilnaya-ustanovka-drajverov-nvidia-v-fedora.html
5) https://forums.kali.org/showthread.php?36680-HELP-Installing-Kali-Linux-on-a-Nvidia-Optimus-system
6) https://askubuntu.com/questions/886629/how-can-i-successfully-boot-my-ubuntu-live-usb

2) https://docs.fedoraproject.org/en-US/quick-docs/bumblebee/

dkms:
3) Зачем нужен DKMS? https://www.linux.org.ru/forum/general/7982729
4) Автоматическая сборка модулей ядра при помощи DKMS https://habr.com/ru/post/266399/

nvidia akmod, cuda:
1) Установка, настройка и тестирование Fedora 21 Workstation на личном или игровом компьютере https://habr.com/ru/post/245651/
8) Правильная установка драйверов NVIDIA в Fedora https://www.easycoding.org/2017/01/11/pravilnaya-ustanovka-drajverov-nvidia-v-fedora.html