什么gcc选项为具有立即操作数的SSE内在函数启用循环展开?

 mobiledu2502915773 发布于 2023-01-02 12:04

这个问题与gcc(4.6.3 Ubuntu)及其在为具有即时操作数的SSE内在函数的展开循环中的行为有关.

具有立即操作数的内在函数的示例是_mm_blend_ps.它期望一个4位立即数整数,它只能是一个常数.但是,使用-O3选项,编译器显然会自动展开循环(如果循环计数器值可以在编译时确定)并生成具有不同立即值的相应混合指令的多个实例.

这是一个简单的测试代码(blendsimple.c),它贯穿了blend的立即操作数的16个可能值:

#include 
#include 

#define PRINT(V)                \
  printf("%s: ", #V);               \
  for (i = 3; i >= 0; i--) printf("%3g ", V[i]);    \
  printf("\n");

int
main()
{
  __m128 a = _mm_set_ps(1, 2, 3, 4);
  __m128 b = _mm_set_ps(5, 6, 7, 8);
  int i;
  PRINT(a);
  PRINT(b);
  unsigned mask;
  __m128 r;
  for (mask = 0; mask < 16; mask++) {
    r = _mm_blend_ps(a, b, mask);
    PRINT(r);
  }
  return 0;
}

可以使用编译此代码

gcc -Wall -march=native -O3 -o blendsimple blendsimple.c

并且代码有效.显然,编译器会展开循环并为直接操作数插入常量.

但是,如果您使用编译代码

gcc -Wall -march=native -O2 -o blendsimple blendsimple.c

你得到混合内在的以下错误:

error: the last argument must be a 4-bit immediate

现在我试图找出-O3中哪个特定的编译器标志处于活动状态,而不是-O2允许编译器展开循环,但是失败了.关注gcc在线文档

https://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Overall-Options.html

我执行了以下命令:

gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts
gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts
diff /tmp/O2-opts /tmp/O3-opts | grep enabled

其中列出了-O3启用但未通过-O2启用的所有选项.当我添加除-O2之外的所有7个列出的标志

gcc -Wall -march=native -O2 -fgcse-after-reload -finline-functions -fipa-cp-clone -fpredictive-commoning -ftree-loop-distribute-patterns -ftree-vectorize -funswitch-loops blendsimple blendsimple.c

我希望行为与-O3完全相同.但是,编译器抱怨"最后一个参数必须是4位立即".

有谁知道问题是什么?我认为最好知道启用这种类型的循环展开所需的标志,以便可以使用#pragma GCC optimize或函数属性有选择地激活它.

(我也很惊讶-O3显然甚至没有启用unroll-loops选项).

我将不胜感激任何帮助.这是关于我给出的SSE编程的演讲.

编辑:非常感谢你的评论.jtaylor似乎是对的.无论优化级别如何,我都抓住了两个较新版本的gcc(4.7.3,4.8.2)和4.8.2对即时问题的抱怨.Moverover,我后来注意到gcc 4.6.3使用-O2 -funroll-loops编译代码,但这在4.8.2中也失败了.显然,人们不能相信这个功能,应该总是使用cpp或模板"手动"展开,正如Jason R指出的那样.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有