【发布时间】:2013-09-03 08:48:33
【问题描述】:
在您的帮助下,我在我的代码(下面的示例)中使用了 SSE,显着提升了性能,我想知道是否可以通过使用 AVX 的 256 位寄存器来改进这种提升。
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]);
所以,我有 3 个问题:如何将上述相当简单的 SSE 代码转换为 AVX?我应该为此导入什么标题?我应该告诉我的 gcc 编译器(而不是 -sse4.1)什么标志才能使 AVX 工作?
提前致谢。为您提供帮助。
【问题讨论】:
-
那你有试过自己解决吗? [顺便说一句,SSE中是否存在水平最大值,以保存最后一行,这在AVX中会更糟]
-
您能否告诉(对美国感兴趣的任何人)您获得了哪些性能改进并与哪些代码进行比较?
-
@MatsPetersson,据我所知,SSE/AVX 中没有一般的水平最大值/最小值。我知道的唯一指令是_mm_minpos_epu16。否定可以用于最大值。但这仅适用于 16 位无符号字。
-
如您所见,max 命令仅在循环外运行一次。所以,这真的没什么大不了的
-
在这段代码中,limit = 64。此外,这段代码运行了数千次 (30,000-1,000,000),我得到了 10-20% 的可靠改进。
标签: c++ sse cpu-registers avx