对于内存复制,ARM SIMD指令集提供了两种不同的指令,即单个传输模式(STM)和多个传输模式(NEON),对于大量内存复制,与使用内部存储器和SDRAM访问相比,具有更高的效率和性能。
这里我们介绍如何使用ARM NEON做内存复制,并给出代码示例:
void neon_memcpy(void* dst, const void* src, size_t size)
{
int64_t* dst64 = reinterpret_cast(dst);
const int64_t* src64 = reinterpret_cast(src);
int64x2_t reg64;
size_t cnt64 = size / 16;
for (size_t i = 0; i < cnt64; i++)
{
reg64 = vld1q_s64(src64 + i*2);
vst1q_s64(dst64 + i*2, reg64);
}
int32_t* dst32 = reinterpret_cast(dst64 + cnt64*2);
const int32_t* src32 = reinterpret_cast(src64 + cnt64*2);
int32x4_t reg32;
size_t cnt32 = (size-cnt64*16)/16;
for (size_t i = 0; i < cnt32; i++)
{
reg32 = vld1q_s32(src32 + i*4);
vst1q_s32(dst32 + i*4, reg32);
}
size_t cnt8 = size-cnt64*16-cnt32*16;
memcpy(dst32 + cnt32*4, src32 + cnt32*4, cnt8);
}
这里将目标和源都解释为void*,允许复制不同类型的数据。以此方式使用必须对源指针进行对应类型的重解释和读强制类型转换,这里使用了reinterpret cast。最好也这样处理目标指