
int16_t input1[16] = {0};int16_t input2[16] = {0};... // fill the arrays with some data// Calculate the sum using a loopint16_t output1[16] = {0};for (int x = 0; x < 16; x++){ output1[x] = input1[x] + input2[x];} 编译器将此代码矢量化,但仅限于SSE指令:
vmovdqu xmm1,xmmword ptr [rbp+rax]lea rax,[rax+10h]vpadDW xmm1,xmm1,xmmword ptr [rbp+rax+10h]vmovdqu xmmword ptr [rbp+rax+30h],xmm1dec rcxjne main+0b0h
为了确保编译器具有生成AVX2代码的选项,我编写了如下相同的计算:
// Calculate the sum using one AVX2 instructionint16_t output2[16] = {0};__m256i in1 = _mm256_loadu_si256((__m256i*)input1);__m256i in2 = _mm256_loadu_si256((__m256i*)input2);__m256i out2 = _mm256_add_epi16(in1,in2);_mm256_storeu_si256((__m256i*)output2,out2); 我看到代码的两部分是等价的(也就是说,output11在执行后等于output2).
它为代码的第二部分输出AVX2指令:
vmovdqu ymm1,ymmword ptr [input2]vpadDW ymm1,ymm1,ymmword ptr [rbp]vmovdqu ymmword ptr [output2],ymm1
我不想重写我的代码来使用内在函数,但是:将它编写为循环更加自然,与旧的(仅限SSE)处理器兼容,并具有其他优点.
那么如何调整我的示例以使编译器能够以AVX2方式对其进行矢量化?
解决方法 在进行浮点运算时,Visual Studio可以轻松生成AVX2代码.我想这足以宣称“VS2013支持AVX2”.但是,无论我做了什么,VS2013都没有生成用于整数计算的AVX2代码(int16_t和int32_t都没有工作),所以我猜这根本不受支持(gcc为版本4.8.2的代码生成AVX2;不确定关于早期版本).
如果我必须对int32_t进行计算,我可以考虑将它们转换为浮动和返回.但是,因为我使用int16_t,所以没有用.
总结以上是内存溢出为你收集整理的c – 为什么MSVC的自动矢量化不使用AVX2?全部内容,希望文章能够帮你解决c – 为什么MSVC的自动矢量化不使用AVX2?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)