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

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

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

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

0

Решение

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

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

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

4

Другие решения

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

0

По вопросам рекламы [email protected]