sin 和 cos 的向量化

2023-11-23

我正在玩编译器资源管理器并遇到了异常(我认为)。如果我想让编译器向量化一个sin计算 using libmvec,我会写:

#include <cmath>

#define NN 512
typedef float T;
typedef T __attribute__((aligned(NN))) AT;

inline T s(const T x)
{
  return sinf(x);
}

void func(AT* __restrict x, AT* __restrict y, int length)
{
  if (length & NN-1) __builtin_unreachable();
  for (int i = 0; i < length; i++)
  {
    y[i] = s(x[i]);
  }
}

使用 gcc 6.2 编译并-O3 -march=native -ffast-math and get

func(float*, float*, int):
        testl   %edx, %edx
        jle     .L10
        leaq    8(%rsp), %r10
        andq    $-32, %rsp
        pushq   -8(%r10)
        pushq   %rbp
        movq    %rsp, %rbp
        pushq   %r14
        xorl    %r14d, %r14d
        pushq   %r13
        leal    -8(%rdx), %r13d
        pushq   %r12
        shrl    $3, %r13d
        movq    %rsi, %r12
        pushq   %r10
        addl    $1, %r13d
        pushq   %rbx
        movq    %rdi, %rbx
        subq    $8, %rsp
.L4:
        vmovaps (%rbx), %ymm0
        addl    $1, %r14d
        addq    $32, %r12
        addq    $32, %rbx
        call    _ZGVcN8v_sinf      // YAY! Vectorized trig!
        vmovaps %ymm0, -32(%r12)
        cmpl    %r13d, %r14d
        jb      .L4
        vzeroupper
        addq    $8, %rsp
        popq    %rbx
        popq    %r10
        popq    %r12
        popq    %r13
        popq    %r14
        popq    %rbp
        leaq    -8(%r10), %rsp
.L10:
        ret

但当我add a cosine到函数,没有向量化:

#include <cmath>

#define NN 512
typedef float T;
typedef T __attribute__((aligned(NN))) AT;

inline T f(const T x)
{
  return cosf(x)+sinf(x);
}

void func(AT* __restrict x, AT* __restrict y, int length)
{
  if (length & NN-1) __builtin_unreachable();
  for (int i = 0; i < length; i++)
  {
    y[i] = f(x[i]);
  }
}

这使:

func(float*, float*, int):
        testl   %edx, %edx
        jle     .L10
        pushq   %r12
        leal    -1(%rdx), %eax
        pushq   %rbp
        leaq    4(%rdi,%rax,4), %r12
        movq    %rsi, %rbp
        pushq   %rbx
        movq    %rdi, %rbx
        subq    $16, %rsp
.L4:
        vmovss  (%rbx), %xmm0
        leaq    8(%rsp), %rsi
        addq    $4, %rbx
        addq    $4, %rbp
        leaq    12(%rsp), %rdi
        call    sincosf               // No vectorization
        vmovss  12(%rsp), %xmm0
        vaddss  8(%rsp), %xmm0, %xmm0
        vmovss  %xmm0, -4(%rbp)
        cmpq    %rbx, %r12
        jne     .L4
        addq    $16, %rsp
        popq    %rbx
        popq    %rbp
        popq    %r12
.L10:
        ret

我看到两个不错的选择。要么调用矢量化版本sincosf或调用向量化sin and cos依次。我尝试添加-fno-builtin-sincos无济于事。-fopt-info-vec-missed抱怨复杂的浮动,但实际上没有。

这是 gcc 的已知问题吗?不管怎样,有没有办法说服 gcc 对后一个例子进行矢量化?

(顺便说一句,有没有办法让 gcc


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sin 和 cos 的向量化 的相关文章

  • 在列表中查找匹配项的最简洁方法

    在列表中查找内容的最佳方式是什么 我知道 LINQ 有一些不错的技巧 但我们也可以获取有关 C 2 0 的建议 让我们对这个常见的代码模式进行最佳重构 目前我使用这样的代码 mObjList is a List
  • ASP.NET 会员电子邮件验证

    尝试基于 C 创建电子邮件验证本文 https web archive org web 20211020153319 https www 4guysfromrolla com articles 062508 1 aspx 我创建了一个 ja
  • Windows CE 6.0 和运行时链接到调试 DLL /MDd

    我在 x86 PC 上使用 Windows CE 6 0 R3 我已经为该平台构建了 NK bin 和 SDK 但我有一些问题需要了解如何使用 MTd 调试 DLL 构建控制台应用程序 如果我尝试构建这个 main c with MDd i
  • ASP.NET Core 中 AsNoTracking 的模拟或更好的解决方法

    您如何模拟 AsNoTracking 或者是否有更好的解决方法来解决此问题 Example public class MyContext MyContextBase Constructor public MyContext DbContex
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 使用 pthread_cond_signal 优雅地终止线程被证明是有问题的

    我需要发射一堆线程 并希望优雅地将它们拉下来 我正在尝试使用pthread cond signal pthread cond wait实现这一目标 但遇到了问题 这是我的代码 首先是thread main static void thrma
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 如何实现可变虚拟成员函数

    所以我有这个功能 virtual void CallRemoteFunction const char pServerGameObjectId const char pFunctionName OVariant arg1 OVariant
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 在 OpenGL 中使用不同的着色器程序?

    我必须在 OpenGL 中针对不同的对象使用两个不同的着色器程序 我发现我必须使用glUseProgram 在不同的着色器程序之间切换 但对此没有太多信息 鉴于我有两个用于不同对象的不同着色器程序 如何为每个着色器程序生成和绑定 VAO 和
  • DataContractJsonSerializer 包含元素类型子类型的通用列表

    我要使用DataContractJsonSerializer用于 JSON 序列化 反序列化 我在 JSON 数组中有两种对象类型 并希望将它们都反序列化为相应的对象类型 具有以下类定义 DataContract public class
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 当 C 中没有足够的内存用于静态分配时会发生什么?

    当您动态分配内存时 例如malloc 1024 sizeof char 结果指针设置为NULL如果没有足够的可用内存来满足请求 当没有足够的内存来满足静态分配时会发生什么 例如char c 1024 char c 1024 不一定是静态分配
  • 如何从 Function App 设置会话 ID 或创建自定义字段到 Application Insights

    功能应用程序如下 public static async Task
  • 您的 C++ 程序中是否仍然存在内存分配失败问题 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在为公司写一些指导方针 我需要回答一些棘手的问题 这一项是相当困难的 解决方案可以是 根本不跟踪 确保使用 new 分配对象 这会在分配失败
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 使用 QTestLib 时抑制 qDebug

    我正在向 Qt 中的项目添加单元测试 并希望使用 QTestLib 我已经设置了测试并且它们运行良好 问题是在项目中我们重写了 qDebug 以输出到我们自己的日志文件 这在运行应用程序时效果很好 问题是当我测试类时 它有时会开始记录 然后
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • 清理 TPL 中的 CallContext

    根据我使用的是基于 async await 的代码还是基于 TPL 的代码 我在逻辑清理方面得到了两种不同的行为CallContext 我可以设置和清除逻辑CallContext如果我使用以下异步 等待代码 正如我所期望的 class Pr
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 检测并删除文本区域中的 URL

  • Kendo UI Grid 序列号列

    我试图将 Kendo 网格的第一列作为串行索引 它不受行记录排序的影响 我有什么办法可以实现这个目标吗 谢谢 您可以使用模板列来实现此目的 这是一个现场演示 展示了如何做到这一点 http jsbin com olutin 10 edit
  • 为什么 Python 返回负时区值?

    For 时间 时区 Python 文档说 本地 非 DST 时区的偏移量 以 UTC 以西的秒数为单位 西欧大部分地区为负值 美国为正值 英国为零 有谁知道为什么它对西欧大部分地区返回负值 这些国家处于正抵消状态 而不是负抵消状态 示例 布
  • iOS 8 中自动调整 UITableViewCell 大小

    我有一个 UITableViewCell 子类 其中包含多行标签 我希望单元格根据该标签的内容动态调整自身大小 我知道 iOS 8 引入了基于自动布局约束的自动调整单元格大小 并且我已经在 SO 上找到了几个这样的示例 但我在正确实现此行为
  • 如何默认将AWS S3存储桶中的所有对象设为公开?

    我正在使用 PHP 库将文件上传到我的存储桶 我已将 ACL 设置为公共读写它工作正常 但文件仍然是私有的 我发现如果我改变受赠者给所有人它使文件公开 我想知道的是我该如何制作所有对象的默认受让人在我的桶中设置为 每个人 或者还有其他解决方
  • 在 AngularJs 中使用 $resource 来保存对象数组

    我在用 resource使用查询从服务器检索数据 服务器返回一个对象数组 我将其存储在斯图克利斯特 我可以发送 更新的 内容斯图克利斯特通过循环数组并使用 save 将数组的每个项目发送回服务器来返回到服务器 我现在想发送所有项目 整个斯图
  • iPhone - 读取Setting.bundle返回错误值

    我创建了一个 Settings bundle 其中包含 Root plist 文件和本地化目录 en lproj 我已经编辑了 Root plist 并添加了一些我想要为我的应用程序设置的设置 当我从 iPhone 中删除该应用程序并安装它
  • 更新到 Android Studio 后模拟器无法启动

    我已经通过标准更新通道将android studio更新到3 0 更新后无法启动模拟器 我已经尝试过以下方法 但没有任何效果 重新启动并重新安装 HAXM 安装程序 重新启动并重新安装 AVD 管理器 从终端启动模拟器 将 RAM 大小更改
  • 如何将 Kubernetes 集群更新到可用的最新版本?

    我最近开始尝试Google Container Engine 我希望您将 Kubernetes 集群升级到可用的最新版本 如果可能的话 不要停机 有什么办法可以做到这一点吗 不幸的是 我们目前拥有的最佳答案是创建一个新集群并将资源移过来 然
  • 如何使用 JavaScript 进行 LDAP 查询?

    我正在尝试制作一个具有 LDAP 查询功能的侧边栏小工具 但一直无法找到关于此事的非常好的或任何有用的文档 我对 Javascript 没有太多经验 并且对 LDAP 查询的功能知之甚少 所以任何信息都会有用 info 主持人 ab c d
  • R (data.table) 按自定义范围对数据进行分组(例如,-18、18-25、...、65+)

    我无法在 R 中找到解决方案 使用 data table 来按自定义范围 例如 18 18 25 65 而不是按单个值对数据进行分组 我现在正在使用的 DT list M Savings mean Savings M Term mean T
  • JTextArea 中的撤消功能

    我正在尝试实现撤消功能JTextArea 谷歌搜索教程并按照其中一个教程编写了以下代码 当按下 Ctrl Z 键时会触发该事件 它不适合我 我错过了什么吗 private void undoActionPerformed java awt
  • aiobotocore - 导入错误:无法导入名称“InvalidIMDSEndpointError”

    下面的代码引发导入异常 import s3fs fs s3fs S3FileSystem anon False 例外 Traceback most recent call last File issue py line 1 in
  • 通过environment.yml使用conda安装npm包

    我想知道是否可以直接通过 conda 安装 npm 包environment yml文件 我知道可以安装pypi包与pip直接如下 name docs channels conda forge dependencies python gt
  • 什么是 Android“提取文本 UI”?

    我最近遇到了一个错误 我的小 EditText 不断膨胀以填充软键盘未占用的任何空间 但仅限于横向模式 我发布了此内容 并得到了一位乐于助人的 StackOverflow 成员的快速回复 我需要添加该内容android imeOptions
  • 如何在cakephp表单中使用jquery.validate插件

    我的 jQuery 代码是 document ready function StudentRegisterForm validate rules email required true email true 在我的表单电子邮件中 td td
  • Bgr32 PixelFormat 中的第四个通道是什么

    我目前正在用 C 做一些图像处理工作 我对 Bgr32 Pixel 格式感到困惑 以下描述来自于microsoft msdn http msdn microsoft com en us library system windows medi
  • Android 上的 Apache Commons 编解码器:找不到方法

    今天我尝试将 apache commons codec 包包含在我的 Android 应用程序中 但无法运行它 Android 无法找到方法 ord apache commons codec binary 并在 DDMS 中输出以下错误 0
  • Jquery UI 日期选择器。禁用日期数组

    我一直在尝试寻找 Jquery ui datepicker 问题的解决方案 但没有运气 这就是我想做的 我有一个应用程序 我正在执行一些复杂的 PHP 操作来返回一个 JSON 日期数组 我希望将其阻止在 Jquery UI Datepic
  • sin 和 cos 的向量化

    我正在玩编译器资源管理器并遇到了异常 我认为 如果我想让编译器向量化一个sin计算 using libmvec 我会写 include