Несколько потоков и памяти

«Правильно» - это ценностное суждение, но (в отличие от других классов) есть большая выгода от того, что классы исключений являются монолитной иерархией, поэтому я бы вообще советовал выбрасывать что-то, полученное из std::exception, , а не просто инт.

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

Что касается преимуществ по сравнению с утверждением if / else: есть пара. Во-первых, исключения позволяют отделить код, который работает с ошибками, поэтому основная идея и удобочитаемость кода не теряются в лабиринте обработки ошибок. Во-вторых, когда у вас есть несколько уровней кода между генерацией и перехватом исключения, код, который выдает исключение, может не знать, как его действительно нужно обрабатывать. Например, ваш код использует std::cout для сообщения о проблеме, но большая часть такого кода будет сообщать об ошибках в std::cerr. Вы можете перейти с одного на другой без каких-либо изменений в коде, который пытался открыть файл (который может быть глубоко в библиотеке, и не имеет ни малейшего представления о том, что следует использовать для этого приложения - и может использоваться в приложении где оба ошибаются, и MessageBox было предпочтительным).

6
задан links77 3 November 2009 в 10:28
поделиться

2 ответа

Разным ядрам разрешено не только читать из одного и того же блока памяти, но и записывать одновременно. «Безопасно» это или нет, это совсем другая история. Вам необходимо реализовать какую-то защиту в своем коде (обычно это делается с помощью семафоров или их производных), чтобы защитить себя от борьбы нескольких ядер за один и тот же блок памяти способом, который вы специально не допускаете.

О размере памяти, которую ядро ​​читает за раз, обычно это значение регистра, 32 бита для 32-битного процессора, 64 бита для 64-битного процессора и так далее. Даже потоковая передача выполняется слово за словом (посмотрите, например, на memcpy).

О том, насколько на самом деле работают несколько ядер одновременно, каждое ядро ​​использует одну шину для чтения и записи в память, поэтому доступ к любым ресурсам (оперативная память, внешние устройства, блок обработки с плавающей запятой) - это один запрос за раз, по одному ядру за раз. Однако фактическая обработка внутри ядра полностью параллельна. Передачи DMA также не блокируют шину, параллельные передачи ставятся в очередь и обрабатываются по очереди (я полагаю, не уверен на 100% в этом).

edit: просто для пояснения, в отличие от другого ответа здесь, я речь идет только о сценарии без кеширования. Конечно, если кэшируется память, доступ только для чтения будет полностью одновременным.

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

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

5
ответ дан 8 December 2019 в 16:05
поделиться

Если в вашем блоке размером 1 МБ действительно нет записей, то да, каждое ядро ​​может читать из своей собственной строки кэша без каких-либо проблем, поскольку записи не выполняются и, следовательно, проблем с когерентностью кеша не возникает. 1286] В многоядерной архитектуре в основном имеется кэш для каждого ядра и «протокол согласования кэша», который делает недействительным кэш на некоторых ядрах, которые не имеют самой последней информации. Я думаю, что большинство процессоров реализуют протокол MOESI для согласованности кэша.

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

Просто для пояснения, как сказано в комментарии нельзя получить доступ к ОЗУ одновременно, поскольку архитектуры x86 и x64 реализуют одну шину, которая совместно используется ядрами с SMP , что гарантирует равноправный доступ к основной памяти. Тем не менее, эта ситуация скрывается кеш-памятью каждого ядра, что позволяет каждому ядру иметь свою собственную копию данных. Для 1 МБ данных может возникнуть конкуренция, пока ядро ​​обновляет свой кеш, но это будет незначительно.

Некоторые полезные ссылки:

10
ответ дан 8 December 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: