Замена memcpy на неоновые
Я пытаюсь превзойти функцию "memcpy", написав неоновые свойства для того же самого. Ниже моя логика:
uint8_t* m_input; //Size as 400 x300
uint8_t* m_output; //Size as 400 x300
//not mentioning the complete code base for memory creat
memcpy(m_output, m_input, sizeof(m_output[0]) * 300* 400);
Неон:
int32_t ht_index,wd_index;
uint8x16_t vector8x16_image;
for(int32_t htI =0;htI < m_roiHeight;htI++){
ht_index = htI * m_roiWidth ;
for(int32_t wdI = 0;wdI < m_roiWidth;wdI+=16){
wd_index = ht_index + wdI;
vector8x16_image = vld1q_u8(m_input);
vst1q_u8(&m_output[wd_index],vector8x16_image);
}
}
Я несколько раз проверял эти результаты на оборудовании imx6.
Результаты:
Memcpy :0.039 milisec
neon memcpy: 0.02841 milisec
Я ЧИТАЮ КУДА ТО, ЧТО БЕЗ ПРЕДПОЛАГАЕМЫХ ИНСТРУКЦИЙ, КОТОРЫЕ МЫ НЕ МОЖЕМ ПОБЕДИТЬ МЕМПИИ
Если это правда, то как мой код дает эти результаты. Это правильно или неправильно
1 ответ
Если правильно написано, не-НЕОН memcpy()
должна быть в состоянии насыщать пропускную способность L3 на вашем устройстве, но для небольших передач (полностью вписывающихся в кэш L1 или L2) все может быть иначе. Ваш тест, вероятно, вписывается в кэш L2.
к несчастью memcpy
должен работать для вызовов любого размера, поэтому он не может разумно оптимизировать для случаев в кеше и вне кеша одновременно с оптимизацией для очень коротких копий, где стоимость определения того, какая оптимизация будет лучше быть доминирующим фактором.
Тем не менее, возможно, что ваш тест не честен. Вы должны быть уверены, что обе реализации не подчиняются различным предварительным условиям кэширования или разному макету виртуальной страницы.
Убедитесь, что ни один тест не выполняется полностью перед другим. Протестируйте одну из реализаций, затем протестируйте другую, затем вернитесь к первой и вернитесь ко второй несколько раз, чтобы убедиться, что они не подвержены условиям прогрева. И используйте одни и те же буферы для обоих, чтобы гарантировать, что нет никакой характеристики для различных частей вашего виртуального адресного пространства, которая наносит ущерб только одной реализации.
Также есть случаи, когда ваши memcpy
не обрабатывает, но это не должно иметь большого значения для крупных переводов.