2015-08-23 4 views
2

Использование g ++ для компиляции функции, которая использует memcpy, а в kcachegrind отображается как с использованием __memcpy_sse2_unaligned.kcachegrind, показывая мою memcpy, не имеет значения

Есть ли способ для memcpy использовать выровненную версию?

Update 1: Это, как я создаю два буфера

int* dstArr = new int [0x10000]; 
int* srcArr = new int [0x10000]; 
+1

Возможно, убедитесь, что буферы, которые вы копируете в и из которых гарантированно выровнены, каким-то образом компилятор узнает об этом. Как создать буферы сейчас? Как выглядит вызов в вашем коде? –

+0

Обновлен код добавления буфера добавления. – MKaras

+1

В большинстве систем и компиляторов основной распределитель должен возвращать адрес выравнивания при распределении памяти. Однако компилятор, возможно, не настолько уверен, что кажется, поэтому он делает безопасную вещь и вызывает встроенную функцию, оптимизированную для негласного копирования. И мы не знаем, проверяет ли эта функция выравнивание и обрабатывает случай, когда оба буфера выровнены. –

ответ

5

Название __memcpy_sse2_unaligned не означает, что вы думаете, что он делает. Фактически, это всего лишь версия memcpy, которая использует SSE2 с неустановленными доступами (на современных/больших процессорах, штраф за неравномерный доступ обычно ниже, чем штраф за вытеснение в программном обеспечении).

Ваш компилятор не думает, что у него есть ум, чтобы оптимизировать такие себя и amd64 ABI не дает memcpy символа, который обещает выравнивание (как __aeabi_memcpy4 и __aeabi_memcpy8 в ARMEABI) большой memcpy.