Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将SSE代码转换为AVX_C++_Sse_Cpu Registers_Avx - Fatal编程技术网

C++ C++;将SSE代码转换为AVX

C++ C++;将SSE代码转换为AVX,c++,sse,cpu-registers,avx,C++,Sse,Cpu Registers,Avx,在您的帮助下,我在代码(下面的示例)中使用了SSE,极大地提高了性能,我想知道使用AVX的256bit寄存器是否可以提高性能 int result[4] __attribute__((aligned(16))) = {0}; __m128i vresult = _mm_set1_epi32(0); __m128i v1, v2, vmax; for (int k = 0; k < limit; k += 4) { v1 = _mm_load_si128((__m12

在您的帮助下,我在代码(下面的示例)中使用了SSE,极大地提高了性能,我想知道使用AVX的256bit寄存器是否可以提高性能

int result[4] __attribute__((aligned(16))) = {0};
__m128i vresult = _mm_set1_epi32(0);
__m128i v1, v2, vmax;
    for (int k = 0; k < limit; k += 4) {
        v1 = _mm_load_si128((__m128i *) & myVector[positionNodeId + k]);
        v2 = _mm_load_si128((__m128i *) & myVector2[k]);
        vmax = _mm_add_epi32(v1, v2);
        vresult = _mm_max_epi32(vresult, vmax);
    }
_mm_store_si128((__m128i *) result, vresult);
return max(max(max(result[0], result[1]), result[2]), result[3]); 
int-result[4]uuu-attribute_uuu((对齐的(16))={0};
__m128i vresult=_mm_set1_epi32(0);
__m128i v1,v2,vmax;
对于(int k=0;k
因此,我有3个问题:如何将上述相当简单的SSE代码转换为AVX?我应该为此导入什么标题?我应该告诉我的gcc编译器(而不是-sse4.1)什么标志才能让AVX工作


提前谢谢。谢谢你的帮助。

那么你自己解决过吗?[顺便问一下,SSE中是否有一个水平最大值,以保存最后一行,而AVX中的水平最大值会更差]您能告诉(对于我们当中感兴趣的人)您得到了哪些性能改进,并与哪些代码进行了比较吗?@MatsPetersson,据我所知,SSE/AVX中没有通用的水平最大值/最小值。我所知道的唯一指示是。求反可用于max。但这仅适用于16位无符号字。正如您所看到的,max命令在循环外仅运行一次。所以,在这段代码中,limit=64并不是什么大买卖。此外,该代码运行了数千次(30000-1000000次),我得到了10-20%的稳定改进。我可以使用常春藤桥(i7-3770)和Vischera(FX-8350)。因此,这段代码不会在那些工作站支持的普通AVX上运行,只会在Haswell(4770…)上运行。对吗?没错。AVX没有大多数256位整数指令。您需要AVX2。在我的FX-8350中,无法识别\u mm256\u add\u epi32和\u mm256\u max\u epi32。另一方面,_mm256_store_si256和_mm256_load_si256似乎还可以。我可以用2\u mm128\u add\u epi32类型函数替换\u mm256\u add\u epi32吗?“这是(以及如何)可能的?”亚历山德罗斯。您必须获取AVX寄存器的高和低部分。Do
\uuum128i low=\umm256\uCastSi256\uSi128(ymm)
\uuum128i high=\umm256\uExtractF128\uSi256(ymm,1)
。水平最大值在循环之外(因此它不适用于64个元素),但适用于4个元素。因此,您的水平SSE max版本较慢。
1.) This code can be easily converted to AVX2 (see below)
2.) #include <x86intrin.h>
3.) compile with -mavx2
    int result[8] __attribute__((aligned(32))) = {0};
    __m256i vresult = _mm256_set1_epi32(0);
    __m256i v1, v2, vmax;

    for (int k = 0; k < limit; k += 8) {
        v1 = _mm256_load_si256((__m256i *) & myVector[positionNodeId + k]);
        v2 = _mm256_load_si256((__m256i *) & myVector2[k]);
        vmax = _mm256_add_epi32(v1, v2);    
        vresult = _mm256_max_epi32(vresult, vmax);
    }
    return horizontal_max_Vec8i(vresult);
    //_mm256_store_si256((__m256i *) result, vresult);
    //int mymax = result[0];
    //for(int k=1; k<8; k++) {
    //    if(result[k]>mymax) mymax = result[k];
    //}
    //return mymax;
int horizontal_max_Vec4i(__m128i x) {
    __m128i max1 = _mm_shuffle_epi32(x, _MM_SHUFFLE(0,0,3,2));
    __m128i max2 = _mm_max_epi32(x,max1);
    __m128i max3 = _mm_shuffle_epi32(max2, _MM_SHUFFLE(0,0,0,1));
    __m128i max4 = _mm_max_epi32(max2,max3);
    return _mm_cvtsi128_si32(max4);
}

int horizontal_max_Vec8i(__m256i x) {
    __m128i low = _mm256_castsi256_si128(x);
    __m128i high = _mm256_extractf128_si256(x,1);
    return horizontal_max_Vec4i(_mm_max_epi32(low,high));
}