2012-06-22 2 views
4

Я хочу скопировать изображение на ядро ​​ARMv7. Наивная реализация - вызов memcpy на строку.Быстрый ARM NEON memcpy

for(i = 0; i < h; i++) { 
    memcpy(d, s, w); 
    s += sp; 
    d += dp; 
} 

Я знаю, что следующий

d, dp, s, sp, w 

все 32 байт выровнены, поэтому мой следующий (по-прежнему довольно наивный) реализация была по линии

for (int i = 0; i < h; i++) { 
    uint8_t* dst = d; 
    const uint8_t* src = s; 
    int remaining = w; 
    asm volatile (
    "1:            \n" 
    "subs  %[rem], %[rem], #32      \n" 
    "vld1.u8 {d0, d1, d2, d3}, [%[src],:256]!  \n" 
    "vst1.u8 {d0, d1, d2, d3}, [%[dst],:256]!  \n" 
    "bgt  1b          \n" 
    : [dst]"+r"(dst), [src]"+r"(src), [rem]"+r"(remaining) 
    : 
    : "d0", "d1", "d2", "d3", "cc", "memory" 
); 
    d += dp; 
    s += sp; 
} 

который был ~ На 150% быстрее, чем memcpy на большом количестве итераций (на разных изображениях, поэтому не используйте кеширование). Я чувствую, что это должно быть нигде рядом с оптимальным, потому что я еще не использовал предварительную загрузку, но, когда я это делаю, мне кажется, что я могу сделать производительность значительно хуже. У кого-нибудь есть понимание?

+0

Попробуйте развернуть петлю как минимум на 2 раза. Нагрузки NEON не являются мгновенными из-за конвейерной обработки и скорости памяти. Если вы делаете 2 загрузки, за которыми следуют 2 магазина, вы должны увидеть преимущество. Предварительная загрузка кеша может определенно ускорить работу, но расстояние чтения вперед должно быть настроено на вашу целевую платформу. – BitBank

+0

Я пробовал это, но разница была незначительной. Я следовал тем же соображениям, но имейте в виду, что эти нагрузки и магазины всего 2 цикла каждый ([источник] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0344k /ch16s06s07.html)). Размер строки кэша - 64 байта, я попытался выполнить предварительную выборку на 64, 128, 192 и 256 байт, что сделало это значительно медленнее (2-3 раза). –

+0

Вы пробовали смотреть на источник memcpy? Возможно, он уже оптимизирован и использует инструкции NEON на вашей платформе. –

ответ

4

ARM имеет замечательную техническую ноту.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.faqs/ka13544.html

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

И да, как упоминает еще один комментатор, предварительная выборка очень затруднительна, и будут работать по-разному с различными микроструктурами, в зависимости от того, насколько велики кеши и насколько велики каждая строка и куча других деталей о дизайне кеша. Если вы не будете осторожны, вы можете обрушиться на нужные вам строки. Я бы рекомендовал избегать его для переносного кода.

Смежные вопросы