Обработка строки с инструкциями MMX

Я пытаюсь реализовать высокопроизводительную программу на C++, каждый цикл я загружаю 8 байтов в регистр MMX и затем обрабатываю их, но, конечно, я хочу остановиться, когда достигну конца строки.

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

Это доставит мне неприятности? или просто "шум" будет исходить от этих байтов, что для меня полностью приемлемо, потому что я справлюсь с этим, как только узнаю о символе \ 0.

2 ответа

SSE2 существует с 2001 года и в настоящее время, по сути, поддерживается повсеместно, но, может быть, у вас есть веские основания придерживаться MMX (возможно, ориентируясь на встроенный P3?)

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

Использование выровненных нагрузок (MMX не различает выровненные и не выровненные нагрузки, но вы, конечно, можете выровнять адрес) гарантирует, что если первый загружаемый байт находится на допустимой странице, то и последний байт также. Так что если вы сначала обрабатываете побайтово, пока не достигнете выровненного адреса, а затем продолжите выровненные загрузки, все будет в порядке.

Если вы используете инструкции SIMD для достижения большей производительности, также разумно использовать собственное распределение памяти. В вашем случае вам нужно выделить блоки памяти, кратные ширине используемых инструкций SIMD: 8 для MMX, 16 для SSE, 32 для AVX. Для этого лучше использовать стандартные функции _mm_malloc и _mm_free (для Visual Studio) или posix_memalign (для GCC).

Другие вопросы по тегам