Какая архитектура с общей памятью с параллельными потоками без блокировки? - PullRequest
2 голосов
/ 14 октября 2011

У меня есть 2d массив памяти. У меня есть несколько потоков, читающих и записывающих отдельные элементы в массиве спонтанно, произвольно и одновременно.

Какой самый быстрый способ или лучший способ создать код доступа к моей памяти? Мне не нравится идея блокировки, потому что она блокирует другие потоки.

Целостность данных на самом деле не так важна, но она должна (в основном) соответствовать. Мой код может обработать несколько ошибок памяти.

Это должно быть очень, очень быстро!

Спасибо за отзыв.

Ответы [ 4 ]

2 голосов
/ 14 октября 2011

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

Однако никто не может предсказать результат.

Однако я бы не назвал этот подход «лучшей практикой».ИМХО лучшая практика - забота о многопоточности и защита данных с помощью соответствующих мьютексов.Мое мнение таково, что каждое приложение должно быть сначала правильным, а только потом быстрым.Непоследовательные результаты просто неверны, не имеет значения, быстро они приходят или нет.

0 голосов
/ 14 октября 2011

Если вы заинтересованы исключительно в производительности, то способ, которым вы заказываете свои обращения к памяти, может сыграть большую роль. Потратьте около часа на чтение слайдов из лекции 1 класса MIT Performance Engineering . Другие лекции также могут быть вам интересны (например, лекция 6).

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

Однако это не должно мешать вам делать что-то правильное.

0 голосов
/ 14 октября 2011

Объявите массив как volatile и убедитесь, что он имеет такую ​​область видимости, что он виден всем вашим потокам. Как правило, мне нравится избегать статики, поэтому либо передавайте массив по ссылке, либо настраивайте все свои потоки для запуска методов класса экземпляра, у которого массив определен как поле экземпляра.

Однако я настоятельно призываю вас переосмыслить, что означает «изменчивый доступ» с точки зрения целостности данных. Лучшая практика - НЕ делать то, что вы пытаетесь, без хорошей механики блокировки. Вы можете подумать, что это небольшая проблема, но вы можете оказаться в очень недетерминированной системе, настолько, что ее данные ни в коей мере не надежны.

Допустим, у вас запущено 8 потоков, и все они получат значение из индекса массива, проведут некоторые вычисления, а затем добавят результат обратно в индекс массива. Поток 1 запускается первым и получает значение индекса 0. Затем все потоки 2-7 запускаются и получают одно и то же значение. Поток 1 выполняет свои вычисления, снова получает индекс, чтобы убедиться, что он имеет «последнее» значение, затем пытается обновить значение. Однако другие потоки ожидают эту память, и из-за некоторой реализации планирования, о которой вы ничего не знаете, между тем, как Поток 1 получает индекс (по-прежнему равен нулю) и записывает свой результат, потоки 2-7 ВСЕ записали свои значения. Затем поток 1 записывает свое значение, перезаписывая все, что сделали остальные 7 потоков. Другие 7 потоков, в свою очередь, вероятно, имели аналогичные «расы» друг с другом, так что значение, перезаписанное потоком 1, вероятно, в любом случае перезаписало результаты половины потоков.

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

0 голосов
/ 14 октября 2011

Используйте класс Interlocked для CAS (CompareAndExchange) объектов / значений в вашем массиве.Это делает операцию атомарной, что гарантирует, что данные не повреждены.Это самая быстрая вещь, которую вы можете сделать (кроме доступа к данным / их изменения напрямую без блокировки).Однако, если вы изменяете размер двумерного массива (увеличиваете / уменьшаете его), у вас будут серьезные проблемы, если вы не используете какой-либо механизм блокировки в вашем массиве.

...