Я написал несколько функций копирования в поисках хорошей стратегии памяти на PowerPC. Использование регистров Altivec или fp с подсказками кеша (dcb *) удваивает производительность по сравнению с простым байтовым циклом копирования для больших данных. Первоначально довольный этим, я бросил регулярную memcpy, чтобы увидеть, как он сравнивается... в 10 раз быстрее, чем мой лучший! Я не собираюсь переписывать memcpy, но я надеюсь научиться этому и ускорить несколько простых фильтров изображений, которые тратят большую часть времени на перемещение пикселей в память и из памяти.
Акустический анализ показывает, что их внутренний цикл использует dcbt для предварительной выборки, с 4-мя векторными чтениями, затем записывается 4 вектора. После настройки моей лучшей функции, чтобы также перехватить 64 байта на итерацию, преимущество производительности memcpy по-прежнему неловко. Я использую dcbz для освобождения полосы пропускания, Apple ничего не использует, но оба кода имеют тенденцию колебаться в магазинах.
prefetch dcbt future dcbt distant future load stuff lvx image lvx image + 16 lvx image + 32 lvx image + 48 image += 64 prepare to store dcbz filtered dcbz filtered + 32 store stuff stvxl filtered stvxl filtered + 16 stvxl filtered + 32 stvxl filtered + 48 filtered += 64 repeat
Есть ли у кого-нибудь идеи о том, почему очень похожий код имеет такой драматический разрыв в производительности? Я бы хотел помассировать настоящие фильтры изображений в любом секретном соусе, который использует memcpy!
Дополнительная информация: Все данные выравниваются по вектору. Я делаю отфильтрованные копии изображения, не заменяя оригинал. Код работает на PowerPC G4, G5 и Cell PPU. Версия Cell SPU уже безумно быстро.