Улучшает ли многопоточный доступ к памяти производительность? - PullRequest
1 голос
/ 13 февраля 2012

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

Быстрее ли распределить эти чтения по нескольким потокам, чем просто по одному?

Правка: точки данных составляют около 20 КБ каждая, и яне может предсказать, в каком порядке они читаются.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

Вообще говоря: да но остерегайтесь промахов кэша .

Допустим, у вас есть int []: рассмотрите возможность его разделения на диапазоны последующих элементов икаждый поток получает свой собственный диапазон (поток 1 получает от 0 до 127, поток 2 - от 128 до 255, ...).

Когда вы читаете один элемент массива, ядро ​​процессора, выполняющее загрузку, имеет виднаиболее вероятно загрузить некоторые из последовательных элементов массива в его кэш , потому что большую часть времени они понадобятся сразу после (immagine for (int i = 0 ;; i ++)do (arra [i]) ): если вы не разберете свои данные грубым способом, вся эта работа будет потрачена впустую.

Вы можете прочитать большеОб этом в следующих статьях Джо Даффи:

Не строго связано: Преждевременная оптимизацияиль миф в частности, часть "Понимание важного порядка"

Как сказал @Alex, общее правило состоит в том, что вы должны всегда измерять и никогда ничего не предполагатьЭффективная масштабируемость с помощью параллелизма - сложный вопрос, требующий глубокого понимания базовой архитектуры.

0 голосов
/ 13 февраля 2012

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

Измерьте производительность, не угадывайте.

0 голосов
/ 13 февраля 2012

Технически да. Вы можете использовать больше потоков для чтения из разных мест в памяти. Процессор работает быстрее, поэтому он может выполнять много операций чтения, скажем, одно чтение на поток, пока не вернется результат первого чтения. Затем начните обработку запросов. Это работает при условии, что RAM не блокируется; т.е. поддерживает несколько чтений одновременно. Например, в вашей памяти есть только 1 строка ввода и 1 строка вывода, тогда это будет блокировка, и никакое количество потоков не поможет.

Теперь имейте в виду, что именно вы делаете с теми данными, которые вы читаете. Если вы отправляете его по сети синхронно или выгружаете его на жесткий диск, это не обязательно означает, что вы должны использовать многопоточность для чтения данных, поскольку это приведет к узкому месту в write_to_HDD / sendData.

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

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