У меня есть простая тестовая программа, которая загружает регистр xmm с помощью команды movdqu , доступ к данным через границу страницы (OS = Linux).Инструкция MOVDQU + граница страницы
Если отображается следующая страница, это работает отлично. Если это не , тогда я получаю SIGSEGV, который, вероятно, ожидается.
Однако это уменьшает полезность невыравниваемых нагрузок довольно . Кроме того, инструкции SSE4.2 (например, pcmpistri), которые допускают для ссылок на неравнозначные ссылки памяти, также проявляют это поведение .
Это все нормально - за исключением есть много реализация STRCMP с помощью pcmpistri, что я обнаружил, что, кажется, не решить эту проблему на всех - и я смог смастерить тривиальные testcases что будет заставляют эти реализации терпеть неудачу, тогда как байт по времени тривиальный. Реализация strcmp по умолчанию будет работать очень хорошо с тем же макетом данных.
Еще одно замечание - она появляется на реализацию библиотеки GNU C для 64-битном Linux имеет __strcmp_sse42 вариант, который, как представляется, использовать инструкцию pcmpistri более безопасным способом. Реализация эта strcmp довольно сложна, но, как представляется, она тщательно пытается использовать , чтобы избежать проблемы с границей страницы. Я не уверен, что это связано с проблемой , описанной выше, или это просто побочный эффект от попыток получить более высокую производительность путем выравнивания данных.
В любом случае, вопрос в первую очередь - где я могу узнать больше по этому вопросу? Я набрал «границу страницы переходов movdqu» и каждый вариант, который я могу придумать Google, но не нашел ничего особенно полезного. Если кто-нибудь может указать мне на дополнительную информацию на это было бы весьма полезно.
Реализация '__strcmp_sse42', вероятно, делает это, чтобы избежать хита производительности при пересечении границы страницы. Процессоры Intel (не уверены в последних) имели историю ужасающей производительности при неверно выровненных доступах, которые пересекают границы страниц. Проблема с ошибкой страницы должна быть неактуальной. – Mysticial
Мне очень любопытно ответить на этот вопрос. В Руководстве по оптимизации Intel (раздел 10.3.6) говорится, что «Unaligned 128-bit SIMD-память может получать границу перекрестной границы данных, поскольку системное программное обеспечение управляет правами доступа к памяти со степенью детализации страницы». Может быть, попробуйте воспроизвести ту же ошибку на некоторых других ОС? –
Или, скорее, ОС ответит на ошибку страницы и сделает ее невидимой для приложения (в отличие от огромного удара производительности). Или сбой приложения, если он не назначен. В этом случае стандартным UB является доступ к нераспределенной памяти. – Mysticial