В многопоточном приложении, лучше ли будет многоядерное или многопроцессорное устройство? - PullRequest
1 голос
/ 04 мая 2010

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

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

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

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

1 Ответ

0 голосов
/ 04 мая 2010

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

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

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

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

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

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

...