2015-05-07 4 views
0

Я пытаюсь победить функцию 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 

Я читаю то, что БЕЗ Поджатая ИНСТРУКЦИИ Мы не можем бить тетсру.

Если это так, то как мой код дает эти результаты. Правильно или неправильно

+2

Я должен задаться вопросом, не предоставил ли ваш поставщик компилятора не специализированную версию memcpy, определенную для вашей платформы. Кроме того, да, если вы смотрите онлайн на какое-то время, вы должны найти функции ARM memcpy(), которые правильно используют 'PLD' для ускорения работы. –

+0

Прочитайте «Что каждый программист должен знать о памяти» (доступно бесплатно), чтобы увидеть, как эти тесты проводятся с научной точки зрения. Пропустите части слишком глубоко, посмотрите на графики и попытайтесь имитировать их. Позже вы будете развивать более глубокое понимание предмета и можете читать более глубокие части. – auselen

ответ

5

Если правильно написано, не-NEON memcpy() должен иметь возможность насыщать полосу пропускания L3 на вашем устройстве, но для небольших передач (установка полностью в кеш L1 или L2) все может быть разным. Вероятно, ваш тест подходит для кеша L2.

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

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

Убедитесь, что ни один тест не выполняется полностью перед другим. Проверьте некоторые из одной реализации, затем проверьте некоторые другие, затем вернитесь к первой и обратно ко второй несколько раз, чтобы убедиться, что они не подвержены условиям разминки. И используйте одни и те же буферы для обоих, чтобы гарантировать отсутствие признаков разных частей вашего виртуального адресного пространства, которое наносит вред только одной реализации.

Также есть случаи, когда ваш memcpy не обрабатывает, но они не должны иметь большого значения для больших передач.

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

  • Нет связанных вопросов^_^