2012-02-05 4 views
2

Я реализую алгоритм am на C/C++ для обработки некоторых векторов, и я подумал, что это может быть хорошей идеей сделать его параллельным, так как я работаю с многоядерным процессором. У меня есть некоторый опыт работы с GPGPU, и плохой доступ к памяти может испортить всю производительность, нужно ли мне рассмотреть любую специальную схему доступа между ядрами на процессоре?Вопросы памяти при многопоточности

Благодаря

+2

Короткий ответ: Да. Даже без многопоточности у процессоров может быть очень неприятная производительность. Примеры: [this] (http://stackoverflow.com/q/8547778/922184) и [это] (http://stackoverflow.com/q/7905760/922184). Многопоточность только усложняет ситуацию. – Mysticial

+0

Если вы не использовали GPGPU для арифметически интенсивных вычислений (для чего они предназначены), возможно, у вас были проблемы с ограничениями доступа к памяти. Однако в отношении многопоточности вы будете уделять гораздо больше внимания переключению контекста и синхронизации (которые, как правило, являются самыми большими проблемами при параллельном программировании), чем при латентности доступа к памяти. – Kiril

+0

@ Lirik: все зависит от размера задействованной работы. Если векторы являются короткими и мало работает контекстное переключение и синхронизация работы, это может быть проблемой.Если векторы длинны, а работа над значительной организацией памяти, управление кешем и настройка кода - ВСЕ. –

ответ

4

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

Вы должны быть примерно осведомлены о размере строки кэша на вашем поле и попытаться 2 вещи:

  1. Ограничить количество строк кэша данных (в частности, строки кэша, которые вы пишете в) доступ в тесной временной последовательности, один поток. То есть, избегайте «грязных» больше строк кеша, чем нужно.
  2. Избегайте, как чума, имеющая два отдельных потока «одновременно», получает доступ к одной и той же линии кэширования данных с одной записью.

(Эти два правила также применяются к страницам данных, если вы имеете дело с большими структурами данных, которые должны быть выгружены.)

Где возможно, создать отдельные структуры рабочих данных (особенно куча) для каждый поток, а не совместное использование данных. Особенно остерегайтесь иметь общий счетчик, который обновляет все потоки, и (очевидно) избегать блокировок и семафоров, за исключением критических стыков, где вам абсолютно необходимо синхронизировать потоки.

+0

@Hot_Licks, незначительная настройка: например. избегайте «касания» (чтения) или «грязного» (написания) дополнительных строк кеша, чем вы должны. –

+0

@KrazyGlew - «Ограничить количество строк кэша данных (в частности, строк кэша, на которые вы пишете), доступ к которым осуществляется в тесной последовательности одним нить." –

1

@ Hot_Licks: На самом деле, если потоки являются двумя гиперпотоками, запущенными на одном и том же ядре, тогда нет проблем с тем, чтобы к ним обращались разные потоки, как при чтении, так и в записи. Чистые линии не требуют затрат между аппаратными потоками на одном процессоре Intel. Даже грязные линии делятся очень дешево - хотя вы можете получить MOnukes, если один парень читает данные, в то время как другой пишет. (Как ни странно, никакого штрафа, если два таких аппаратных/гиперпотока пишут одновременно.)

С единственным «резьбовым» процессором AMD, бульдозером, я думаю, что обмен письмами еще менее дорогостоящий.

Но это относится только к аппаратным потокам, например. Интеллектуальные процессоры Intel или логические процессоры, работающие на одних и тех же физических процессорах. Если они работают на разных физических процессорах, выигрыш невозможен. Поскольку большинство программных пакетов потоковой передачи произвольно переносят потоки, ваше правило не так уж плохо.

Тем не менее вы все равно хотите минимизировать (a) линии, к которым обращается один поток, и (b) общее количество строк, к которым обращаются несколько потоков, даже если они не используются другими потоками. Поскольку тайники - MLC, LLC - являются ограниченным ресурсом. Но вы правы - когда вам не хватает кеша ...

Смежные вопросы