我对以下循环进行了矢量化,该循环出现在我正在开发的应用程序中:
void vecScl(Node** A, Node* B, long val){
int fact = round( dot / const);
for(i=0; i<SIZE ;i++)
(*A)->vector[i] -= fact * B->vector[i];
}
这是 SSE 代码:
void vecSclSSE(Node** A, Node* B, long val){
int fact = round( dot / const);
__m128i vecPi, vecQi, vecCi, vecQCi, vecResi;
int sseBound = SIZE/4;
for(i=0,j=0; j<sseBound ; i+=4,j++){
vecPi = _mm_loadu_si128((__m128i *)&((*A)->vector)[i] );
vecQi = _mm_set_epi32(fact,fact,fact,fact);
vecCi = _mm_loadu_si128((__m128i *)&((B)->vector)[i] );
vecQCi = _mm_mullo_epi32(vecQi,vecCi);
vecResi = _mm_sub_epi32(vecPi,vecQCi);
_mm_storeu_si128((__m128i *) (((*A)->vector) + i), vecResi );
}
//Compute remaining positions if SIZE % 4 != 0
for(; i<SIZE ;i++)
(*A)->vector[i] -= q * B->vector[i];
}
虽然这在正确性方面有效,但无论有没有 SSE,性能都是完全相同的。我正在编译代码:
g++ *.cpp *.h -msse4.1 -march=corei7-avx -mtune=corei7-avx -mno-avx -mno-aes -Warray-bounds -O2
这是因为我没有分配(并相应地使用 SSE 函数)对齐的内存吗?更改代码非常复杂,所以我现在有点避免这样做。
顺便说一句,就进一步改进而言,考虑到我受限于 Sandy Bridge 架构,我能做的最好的是什么?
EDIT: 编译器尚未对代码进行向量化。首先,我将向量的数据类型更改为short
s,这不会改变性能。然后,我编译了-fno-tree-vectorize
并且性能是一样的。
多谢