Что будет лучше в многопоточном приложении: многоядерное или многопроцессорное?

StackOverflow https://stackoverflow.com/questions/2767795

Вопрос

Я уже много читал по этой теме здесь (например, stackoverflow.com/questions/1713554/threads-processes-vs-multithreading-multi-core-multiprocessor-how-they-are или многопроцессорный, многоядерный и гиперпоточный) и в других местах (например, ixbtlabs.com/articles2/cpu/rmmt-l2-cache.html или Software.intel.com/en-us/articles/multi-core-introduction/), но я до сих пор не уверен насчет пара вещей, которые кажутся очень простыми.Поэтому я подумал, что просто спрошу.

(1) Является ли многоядерный процессор, в котором каждое ядро ​​имеет выделенный кэш, фактически тем же, что и многопроцессорная система (конечно, сбалансированная по скорости процессора, размеру кэша и т. д.)?

(2) Допустим, у меня есть несколько изображений для анализа (например, компьютерного зрения), и эти изображения загружены в ОЗУ.Мое приложение создает поток для каждого изображения, которое необходимо проанализировать.Будет ли это приложение на многоядерном процессоре с общим кэшем работать медленнее, чем на многоядерном процессоре с выделенным кэшем, и будет ли последний работать с той же скоростью, что и на эквивалентном одноядерном многопроцессорном компьютере?

Спасибо вам за помощь!

Это было полезно?

Решение

Размер кэша важен.Для этого я предполагаю процессоры x86 и использую только кэш L2, который используется совместно с двухъядерными процессорами.

Если вы сравниваете 2 одноядерных процессора с 1 двухъядерным процессором и оба одноядерных процессора имеют одинаковый объем кэша данных (работают с одинаковой скоростью), то у вас больше кэша, поэтому в кэш может поместиться больше частей изображений. , и весьма вероятно, что если бы при обработке данных изображения приходилось многократно загружать и/или сохранять эти данные, это происходило бы быстрее при тех же тактовых частотах.

Если вы сравниваете 2 одноядерных процессора с 1 двухъядерным процессором, кэш данных которого в два раза превышает размер кеша данных каждого одноядерного процессора, то для работы каждого процессора будет использоваться около половины кеша данных.Вполне вероятно, что в дополнение к данным изображения, которые должен использовать каждый независимый поток, будут некоторые общие данные.Если эти общие данные хранятся в общем кэше данных, их легче разделить между двумя ядрами, чем при настройке 2xSingle.При настройке 2xSingle каждый блок общих данных будет храниться в одном из кэшей, и когда другому процессору потребуется использовать эти данные, возникнут небольшие накладные расходы.

Двухъядерные машины также облегчают миграцию потоков с одного ядра на другое на одном процессорном модуле, поскольку не нужно заполнять кеш нового процессора потока, в то время как у другого есть данные, которые ему больше не нужны. космос.

Я бы посоветовал вам поэкспериментировать с ограничением количества потоков от 3 до 10 на ядро ​​в любое время для общего использования.Все потоки будут конкурировать друг с другом за это пространство кэша, поэтому слишком многие сделают так, что все данные из одного потока будут вытеснены до того, как этот поток будет перепланирован.Кроме того, если каждый поток может перебирать несколько файлов изображений, вы немного выиграете, если сохраните пространство стека каждого потока в кеше, поскольку у вас меньше стеков.Вы также уменьшаете объем памяти, которую ОС должна использовать для обработки потоков.

Самый большой выигрыш — это когда вы можете перекрывать обработку с медленным доступом, например, с диском, сетью или взаимодействием с человеком, поэтому вам нужно ровно столько потоков, чтобы процессоры были заняты обработкой.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top