私は SSE/SSE2 命令を使用してコードを最適化するのは初めてで、今まであまりうまくいっていませんでした。私の知る限り、一般的な SSE 最適化関数は次のようになります。
void sse_func(const float* const ptr, int len){
if( ptr is aligned )
{
for( ... ){
// unroll loop by 4 or 2 elements
}
for( ....){
// handle the rest
// (non-optimized code)
}
} else {
for( ....){
// regular C code to handle non-aligned memory
}
}
}
ptr
ただし、メモリポイントが 16 バイトなどでアラインされているかどうかを正しく判断するにはどうすればよいでしょうか。この関数に渡されるすべてのメモリが整列されていることを確認できないため、整列されていないメモリの通常の C コード パスを含める必要があると思います。また、組込み関数を使用してアライメントされていないメモリから SSE レジスタにデータをロードするのは、非常に遅いようです (通常の C コードよりもさらに遅い)。
前もって感謝します...