Инициализация миллиардов целых чисел для значения 1 - PullRequest
6 голосов
/ 01 декабря 2011

Каков хороший дизайн потока posix для инициализации миллиарда целых чисел с использованием c / c ++ на 8-ядерном процессоре платформы Linux с 32 ГБ памяти DRAM?Спасибо за вашу помощь.

Ответы [ 5 ]

8 голосов
/ 01 декабря 2011

Это тривиальная операция, и вам не нужно рассматривать многопоточность. Просто сделайте это с memcpy в одной теме.

4 голосов
/ 01 декабря 2011

Точное количество потоков не будет таким ограничивающим фактором, но иногда для этих вопросов стоит перегружать, скажем, использовать 2 потока на физическое ядро.

Но настоящим узким местом будет ввод-вывод, запись данных в ОЗУ. Вы должны позаботиться о том, чтобы данные, которые должны быть заменены, никогда не читались до того, как вы их сотрете. Затем вы должны убедиться, что записи в память появляются большими порциями и (если возможно) как «сквозные», в монпроцессорном ЦП есть инструкции для более поздних версий.

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

2 голосов
/ 01 декабря 2011

Для чего это нужно?В зависимости от использования может работать следующий сценарий: вы инициализируете одну страницу памяти (это несколько КБ) всем 1.Затем вы отображаете эту страницу в виртуальное адресное пространство столько раз, сколько необходимо, с флагом копирования при записи.Таким образом, при чтении вы получите все из всех этих виртуальных страниц, при записи система выделит больше физических страниц по мере необходимости.

1 голос
/ 01 декабря 2011

Возможно алгоритм разделяй и властвуй ? Разделите память, содержащую целые числа, на некоторое число, соответствующее количеству потоков, оптимальных для вашей системы. Затем запустите один поток на раздел, который инициализирует все его целые числа.

0 голосов
/ 01 декабря 2011

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

Реальный ответ - профилировать вашу систему (поскольку вы указали очень конкретную цель, похоже, вы не хотите разрабатывать сбалансированный алгоритм, который будет достаточно для большинства целей). Современные ЦП, которые имеют доступ к 32 ГБ памяти DRAM, часто имеют аппаратные счетчики производительности (у Intel и AMD), которые значительно облегчают поиск ЦП и операций кэширования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...