@ Hot_Licks: На самом деле, если потоки являются двумя гиперпотоками, запущенными на одном и том же ядре, тогда нет проблем с тем, чтобы к ним обращались разные потоки, как при чтении, так и в записи. Чистые линии не требуют затрат между аппаратными потоками на одном процессоре Intel. Даже грязные линии делятся очень дешево - хотя вы можете получить MOnukes, если один парень читает данные, в то время как другой пишет. (Как ни странно, никакого штрафа, если два таких аппаратных/гиперпотока пишут одновременно.)
С единственным «резьбовым» процессором AMD, бульдозером, я думаю, что обмен письмами еще менее дорогостоящий.
Но это относится только к аппаратным потокам, например. Интеллектуальные процессоры Intel или логические процессоры, работающие на одних и тех же физических процессорах. Если они работают на разных физических процессорах, выигрыш невозможен. Поскольку большинство программных пакетов потоковой передачи произвольно переносят потоки, ваше правило не так уж плохо.
Тем не менее вы все равно хотите минимизировать (a) линии, к которым обращается один поток, и (b) общее количество строк, к которым обращаются несколько потоков, даже если они не используются другими потоками. Поскольку тайники - MLC, LLC - являются ограниченным ресурсом. Но вы правы - когда вам не хватает кеша ...
Короткий ответ: Да. Даже без многопоточности у процессоров может быть очень неприятная производительность. Примеры: [this] (http://stackoverflow.com/q/8547778/922184) и [это] (http://stackoverflow.com/q/7905760/922184). Многопоточность только усложняет ситуацию. – Mysticial
Если вы не использовали GPGPU для арифметически интенсивных вычислений (для чего они предназначены), возможно, у вас были проблемы с ограничениями доступа к памяти. Однако в отношении многопоточности вы будете уделять гораздо больше внимания переключению контекста и синхронизации (которые, как правило, являются самыми большими проблемами при параллельном программировании), чем при латентности доступа к памяти. – Kiril
@ Lirik: все зависит от размера задействованной работы. Если векторы являются короткими и мало работает контекстное переключение и синхронизация работы, это может быть проблемой.Если векторы длинны, а работа над значительной организацией памяти, управление кешем и настройка кода - ВСЕ. –