gpt4 book ai didi

c++ - 性能与 SSE 相同

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:41 25 4
gpt4 key购买 nike

我矢量化了以下循环,它出现在我正在开发的应用程序中:

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 架构,我能做的最好的是什么?

编辑:编译器尚未对代码进行矢量化。首先,我将 vector 的数据类型更改为 short,这不会改变性能。然后,我用 -fno-tree-vectorize 编译,性能是一样的。

非常感谢

最佳答案

如果您的数据很大,那么您可能只是受内存限制,因为每次加载/存储您执行的 ALU 操作非常少。

但是您可以尝试一些小的改进:

inline void vecSclSSE(Node** A, Node* B, long val){
// make function inline, for cases where `val` is small

const int fact = (dot + const / 2 - 1) / const;
// use integer arithmetic here if possible

const __m128i vecQi = _mm_set1_epi32(fact);
// hoist constant initialisation out of loop

int32_t * const pA = (*A)->vector; // hoist invariant de-references out of loop
int32_t * const pB = B->vector;

__m128i vecPi, vecCi, vecQCi, vecResi;

for(int i = 0; i < SIZE - 3; i += 4) { // use one loop variable
vecPi = _mm_loadu_si128((__m128i *)&(pA[i]));
vecCi = _mm_loadu_si128((__m128i *)&(pB[i]));
vecQCi = _mm_mullo_epi32(vecQi,vecCi);
vecResi = _mm_sub_epi32(vecPi,vecQCi);
_mm_storeu_si128((__m128i *)&(pA[i]), vecResi);
}

//Compute remaining positions if SIZE % 4 != 0
for(; i<SIZE ;i++)
pA[i] -= q * pB[i];

}

关于c++ - 性能与 SSE 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22510614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com