SIMD(SSE、)优化的数据对齐

SSE和SSE2,3指令,一般需要处理的数据是16字节对齐。有两种方法。

1,当使用MMX/SSE/SSE2操作以字节为单位的BUFFER时,比如MEMCPY,MEMSET之类的,利用64/128BIT操作指令加快拷贝过程。输入的数据不一定要求8/16字节对齐。在汇编代码中,对数据掐头,去尾,找到16字节对齐开始和结束的数据段位置,使用MMX/SSE/SSE2 进行64/128BIT操作。然后使用一般汇编指令对非16字节对齐的数据进行操作。同事研究的VC8 CRT memcpy/memset 汇编代码中包括SSE2的优化(SSE2才具有128 BIT 整型操作)。但VC7没有。不过可以参考DOOM3 SDK的MMX优化代码。当拷贝字节多时,优化效果才会明显。 使用SSE代码进行MEMSET 也是可行的(一次SET 16字节,set 内容为0),比一个字节一个字节的SET要快不少。

2,使用trick自定义malloc,函数如下:
void* alloc16(const unsigned int bytes)
{
ptr = (byte *) malloc( bytes + 16 + 4 );
if (!ptr)
{
......
}

alignedPtr = (byte *) ( ( (int) ptr ) + 15 & ~15 );
if ( alignedPtr - ptr < 4 ) {
alignedPtr += 16;
}
*((int *)(alignedPtr - 4)) = (int) ptr;
return (void *) alignedPtr;
}
void free16(void* ptr)
{
free( (void *) *((int *) (( (byte *) p ) - 4)) );
}

VC7对于非16字节对齐的SSE操作,运行时报告的错误是一个非法地址访问错误。而不是HELP里提到的会报告真正错误原因。

你可能感兴趣的:(优化)