Я хочу знать, как правильно реализовать программу на C ++, в которой у меня есть функция func, которую я хочу выполнить в одном потоке. Я хочу сделать это, потому что я хочу проверить одноядерную скорость моего процессора. Я зациклю эту функцию (func) около 20 раз и запишу время выполнения каждого повторения, затем подведу итоги и получу среднее время выполнения.
#include int func(long long x) < int div = 0; for(long i = 1; i int main()
Итак, в этой программе выполняется ли func на одном конкретном ядре?
Вот исходный код моей программы:
#include #include #include #include #include «font.h»#include «timer.h» using namespace std; #define steps 20 int func(long long x) < int div = 0; for(long i = 1; i int main() < SetFontConsolas(); // Set font consolas ShowConsoleCursor(false); // Turn off the cursor timer t; short int number = 0; cout double time = 0.0; for(int i = 0 ; i < steps ; i++) time += t.times[i]; // sum all recorded times time /= steps; // get the average execution time cout
Решение
Нет, у вашей программы есть как минимум два шага: основной и тот, который вы создали для запуска func , Более того, ни один из этих потоков не гарантированно исполняется на particular core , В зависимости от планировщика ОС они могут переключать ядра непредсказуемым образом.
MSCONFIG ИЛИ КАК ВАС ВВЕЛИ В ЗАБЛУЖДЕНИЕ!
Хотя основной поток будет в основном просто ждать. Если вы хотите заблокировать выполнение потока на определенном ядре, вам нужно установить привязку к ядру потока с помощью какого-либо специфичного для платформы метода, такого как SetThreadAffinityMask на винде. Но вам не нужно углубляться в это, потому что в вашем примере нет кода, чувствительного к переключению ядра. Нет даже необходимости создавать отдельный поток, предназначенный для выполнения вычислений.
Другие решения
Если ваша программа не имеет нескольких потоков в исходном коде и если компилятор не вставляет автоматическое распараллеливание, программа должна работать на одном ядре (за раз).
Теперь в зависимости от вашего компилятора вы можете использовать соответствующие уровни оптимизации, чтобы гарантировать, что он не распараллеливается.
С другой стороны, может случиться так, что компилятор может полностью исключить цикл в функции, если он может статически вычислить результат. Это, однако, не похоже на проблему с вашим делом.
Я не думаю, что какой-либо компилятор C ++ использует многоядерный, за вашей спиной. При этом возникнут большие языковые проблемы. Если вы не порождаете потоки и не используете параллельную библиотеку, такую как MPI, программа должна выполняться только на одном ядре.
Источник: web-answers.ru
Android-приложения работают лишь на одном ядре — правда или вымысел?
Когда у меня появился первый компьютер, никому даже и в голову не могло прийти спросить, сколько ядер у его процессора. Однако прошло совсем немного времени, и появились двухъядерные процессоры, затем четырехъядерные и так далее. То же самое достаточно быстро случилось со смартфонами, однако не все понимают, для чего процессору смартфона иметь 8 ядер. Более того, многие считают, что Android-приложения для своей работы используют только одно ядро. Гэри Симс из Android Authority разобрался в этом вопросе и опубликовал свое объяснение.
Разблокировать все ядра процессора и оперативную память в Windows в msconfig (почему не нужно)
Первое, что следует знать о мобильных ARM-процессорах, это то, что в восьмиядерных процессорах используется как минимум две разные архитектуры ядер. В современном 64-битном восьмиядерном процессоре будут использованы высокопроизводительные ядра Cortex-A72 вместе с энергоэффективными ядрами Cortex-A53. Такое сочетание называется big.LITTLE, и это отличает ARM-процессоры от тех, что используются для компьютеров. 8-ядерный процессор в смартфоне используется не для высокой производительности, а ради энергоэффективности. Если мы это запомнили, тогда можно идти дальше.
Как используются многоядерные процессоры
Если нагрузить компьютер одной задачей, он отлично с ней справится, однако так в современном мире не бывает. И на компьютеры, и на смартфоны сваливается несколько задач одновременно, поэтому в сердце операционной системы, включая Android, сидит планировщик. Планировщик решает, каким задачам, в каком порядке и количестве будет уделено время процессора. Все планировщики разработаны по-разному и могут отдавать приоритет определенным типам задач.
Если устройство работает на процессоре с несколькими ядрами, это позволяет планировщику отправлять одну задачу на первое ядро, а другую — на второе. Чем больше ядер процессора, тем больше процессов смогут выполняться одновременно. Однако может ли многоядерный процессор помочь решить одну задачу быстрее? Может, если задача подразумевает разбиение.
Программы бывают однопоточными и многопоточными. Однопоточные программы не могут извлечь никакой выгоды от использования многоядерных процессоров, в то время как многопоточные программы приспособлены разбиваться на разные задачи, которые могут выполняться одновременно на разных ядрах.
Как это происходит в случае с Android
Android, можно сказать, создан для использования многоядерных процессоров, так как порой даже для выполнения однопоточной программы системе требуется запустить дополнительный процесс, что отчасти делает ее многопоточной. Помимо этого, есть большое количество задач, которые нужно одновременно выполнять, например, синхронизация. Однако перейдем вплотную к приложениям. Созданы ли они для работы с многоядерными процессорами?
Гэри Симс провел несколько тестов и не нашел ни одного приложения, которое использовало бы все 8 ядер на 100%. Так и должно быть, ведь, как мы помним, 8-ядерные процессоры применяются ради энергоэффективности. Система выбирает подходящую комбинацию ядер и, когда требуется нагрузка, подключает высокопроизводительные ядра, а когда есть возможность сэкономить энергию, в ход идут энергоэффективные. Однако в некоторых случаях работают и те и другие.
Тесты
Для того чтобы проверить, как используются ядра процессора при выполнении различных приложений, Гэри Сименс создал программу, считывающую эти данные. Затем он протестировал несколько приложений на устройстве с четырехъядерным Snapdragon 801 и на устройстве с восьмиядерным Snapdragon 615. Совместно с Робертом Триггсом из Android Authority были созданы графики работы ядер этих двух процессоров с одним и тем же приложением.
Первым на тест отправился браузер Chrome. Если бы эта программа являлась однопоточной, стоило бы ожидать постоянной нагрузки двух ядер с периодически появляющейся активностью остальных. Однако большую часть времени Chrome использовал все четыре ядра.
В случае с восьмиядерным Snapdragon 615 браузер Chrome большую часть времени использовал 7 ядер, иногда 8, а иногда 6 или 4. Так как Snapdragon 615 — это big.LITTLE-процессор, то и ядра его используются иначе. Вы можете видеть на графике, как растет нагрузка на одном ядре в то время, как она падает на другом.
Chrome — многопоточное приложение, а что с остальными? Точно таким же образом были проверены приложения Gmail, YouTube Riptide GP2 и Temple Run 2. Игра Temple Run 2 нагрузила только одно ядро, однако при запуске на процессоре MediaTek нагрузка была равномерно распределена. Остальные приложения подтвердили чистоту эксперимента с Chrome. Была также прослежена работа AnTuTu, и на графике четко видно, как искусственно создается нагрузка на все ядра процессора.
Вывод
Если вы еще когда-нибудь услышите, что Android-смартфону не нужен восьмиядерный процессор и что приложения используют одно ядро, знайте — это не так. Как используются ядра процессора во время работы приложений, вы могли видеть на графике. И думаю, вы запомнили, что 8-ядерные процессоры используют в смартфонах не для рекордного быстродействия, а для разумного использования ресурсов, давая возможность находить компромисс между мощностью и энергоэффективностью.
По материалам Android Authority
Теги
- Мобильные процессоры
- Новичкам в Android
- Приложения для Андроид
Источник: androidinsider.ru
Программа работает на одном ядре
В многопроцессорных системах иногда полезно в целях отладки (или, например, измерения производительности) запускать программу только на одном процессоре. Это можно сделать в Linux с помощью команды:
taskset -c 0 ./program_name
Это команда запускает процесс с заданным свойством CPU affinity; оно, в свою очередь, определяет список процессоров, на которых планировщик может запускать данный процесс. В данном примере оно позволяет планировщику запускать заданный процесс только на ядре номер 0. Можно также указать несколько номеров через запятую.
2 комментария :
а что ты так отлаживаешь? и как это поможет производительность измерить? для отладки лучше пользоваться threadsanitizer если конечно он поддерживается на железяке. Ответить Удалить
Я отлаживаю и запускаю тесты на производительность на своем восьмиядерном лаптопе, когда целевая платформа, предположим, одно ядро имеет. И в какой-то момент per process clocks вырастают в два раза, а wall clocks снижаются немного, из чего я делаю вывод, что подключается второе ядро (хотя делает оно, похоже, то же самое, что и первое делало). Вот чтобы этого избежать, я одним ядром ограничиваюсь, когда не на целевой платформе работаю. А предпочитаю я все-таки локально все делать по мере возможности и не дергать железяку лишний раз. Удалить
Источник: dgrafov.blogspot.com