Я пытаюсь победить функцию memcpy, написав неоновые свойства для этого же. Ниже моя логика:Замена memcpy на неоновые intrinsics
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
Я читаю то, что БЕЗ Поджатая ИНСТРУКЦИИ Мы не можем бить тетсру.
Если это так, то как мой код дает эти результаты. Правильно или неправильно
Я должен задаться вопросом, не предоставил ли ваш поставщик компилятора не специализированную версию memcpy, определенную для вашей платформы. Кроме того, да, если вы смотрите онлайн на какое-то время, вы должны найти функции ARM memcpy(), которые правильно используют 'PLD' для ускорения работы. –
Прочитайте «Что каждый программист должен знать о памяти» (доступно бесплатно), чтобы увидеть, как эти тесты проводятся с научной точки зрения. Пропустите части слишком глубоко, посмотрите на графики и попытайтесь имитировать их. Позже вы будете развивать более глубокое понимание предмета и можете читать более глубокие части. – auselen