Как подсчитать/проверить количество параллельных ветвей процессора?
Доброго времени суток, users!
Возможно ли определить практическим путем количество параллельных ветвей процессора? Желательно на языке assembler. К тому же интересно узнать, где увидеть эту информацию в документации процессора (i3-6100), чтобы сравнить с практическими значениями.
Что я понимаю под практическим путем:
- допустим существуют операции логические, целочисленные и с плавающей запятой. Каждое из них выполняют разное количество времени, у каждого микропроцессора они свои. Нужно определить сколько параллельных ветвей стоит в процессоре (т.е. позапускать, как я понимаю, эти операции).
Допустим с логическими операциями, их должно быть по умолчанию четыре (как пример для пояснения), значит на вход подаем 4 логических операции (И, ИЛИ, разные вообщем). Итак. послали одну команду - t времени. Послали две команды - t времени, четыре операции - t времени (примерно все одинаковые будут), но когда мы подаем пятую команду, то она распределиться уже не сможет и время будет возрастать и если строить график, то он будет на начальных этапах одинаковый, а затем резко возрастет, нужно определить этот момент резкого возрастание - это и будет то количество параллельных ветвей в процессора
что вы имеете в виду под параллельными ветвями и как собираетесь одновременно подавать команды?
весь ваш код сначала преобразуется микрокодом процессора в более низкоуровневый, оптимизируется и конвейерно исполняется. ещё есть гипертрединг и многоядерность, предсказание ветвлений и куча другой магии, которую достоверно не узнать
У вас - странная терминология. Процессор имеет на борту несколько АЛУ (маркетинговое название Thread).
И вы пытаетесь практическим способом посчитать сколько их?
Меня всегда интересовал vision of next step. После того как вы узнали что у вас на борту 8/16/32 threads,
что будет дальше? Какую вы будете делать логику? Или какие алгоритмы вы собираетесь реализовать на основе этой информации? Я думаю что я подкину вам несколько сюрпризов и вы пересмотрите первую идею.
mayton2019, дальше я продемонстрирую преподавателю, что практическим путем определил количество параллельных ветвей и чтобы эту информацию подтвердить, можно сравнить с информацией указанной в документации.
Понимаете, у нас не было (да и нет наверное) как такового обучения ассемблера, впервые в жизни приходится с ним работать..
Хорошо. Я просто добавлю несколько своих сомнений.
1) Если твои тестовые измерительные потоки будут вести интеракцию с памятью через кеши L1/L2 (а они будут это делать если ты работаешь с памятью) то с ростом количества потоков производительность будет падать. Потоки будут конкурировать за кеши. Я не помню точно но есть уточненние к закону Амдала в части когерентности. И эта когерентность резко (иногда катастрофически) понижает перформанс при росте потоков. Тоесть очень малая часть приложений скейлятся от запуска дополнительных потоков.
2) Современные процессоры будут сопротивляться твоим измерительным атакам. Если это процессоры эконом-класса то они будут держать тактовую частоту на пониженном режиме. У них есть условие при котором эконом режим выключается и тактовая подскакивает до паспортных величин. Это тонкий маркетинг. Когда процессор продавали - указали максималку. Но в реальности ты можешь это не использовать. И этот эффект прыжка частоты надо учитывать. Особенно на ноутбуках. И такой-же тёмный мрак - это мобильные процессоры. Всякие Cortex и прочие. Они могут экономить батарею и там режим вообще другой.
3) Перед тем как эспериментировать посмотри на утилиту CPUZ. Просто понаблюдай какие сведенья она показывает. До того как начнёшь кодить.
4) Почитай базовые различия в Intel/AMD в разных статьях по сравнению. Есть мнение (уже не моё) что в понятие Kernel/Thread они вкладывают разный смысл.
mayton2019, просто как я понимаю, в какой то момент у нас серьезно изменится время выполнения команд, допустим как выше писал - 1..4 команды выполняются +/- в одно время, но 5 уже отличаться будет от прошлых запусков и мне бы хотя бы шаблон будущего кода (такая ситуация, что преподаватель не особо шарит в этом языке, и если я покажу логичный код, то вполне засчитает.
Само задание - практикой определить количество параллельных ветвей (пока сёрфил по интернету, предположил, что это потоки, так это или я путаю?)
Я как-то делал рендеринг трехмерной картинки с шарами в параллелизме на разных языках (С++/Java) и у меня выходил максимальнй перформанс на 5 вычислительных потоках хотя это был Intel Core i3 с 2 ядрами по 2 потока. Тоесть 4 штуки. И такой эффект был на разных языках разработки.
К чему это я. Очень сложно будет вам провести ОБОСНОВАНИЕ правоты вашего метода.