如何优化分配恒定股息?

2023-12-28

优化为除以众所周知,gcc 对常量进行了很好的优化:)

现在我想知道如何dividing常数被优化。 gcc 不能帮助我,clang 也是如此。

也许我不擅长搜索这些信息,但我找不到关于优化的材料除常数。 (相比之下,除以常数介绍得很好。)

#include <stdio.h>

int f(int x)
{
    // can I optimize off the idiv opcode here?
    return 33659/x;
}

int main()
{
    int x;
    scanf("%d", &x);
    printf("%d", f(x));
    return 0;
}

EDIT1:

#include <stdio.h>

#define DIVIDEND 33

void f ( unsigned int* arr, int n )
{
    for ( int i = 0; i < n ; i++ )
    {
        arr[i] = DIVIDEND / arr[i];
    }
}

int main()
{
    const int n = 1024;
    unsigned int buf[n];
    for ( int i = 0; i < n; i++ )
    {
        scanf ( "%u", buf + i );
    }
    f ( buf, n );
    for ( int i = 0; i < n; i++ )
    {
        printf ( "%d", buf[i] );
    }
    return 0;
}

优化为clang -O3 -march=native div.c -o div仅展开循环,同时:

#include <stdio.h>

#define DIVIDEND 33
#define DIVISOR DIVIDEND

void f ( unsigned int* arr, int n )
{
    for ( int i = 0; i < n ; i++ )
    {
        //arr[i] = DIVIDEND / arr[i];
        arr[i] = arr[i] / DIVISOR;
    }
}

int main()
{
    const int n = 1024;
    unsigned int buf[n];
    for ( int i = 0; i < n; i++ )
    {
        scanf ( "%u", buf + i );
    }
    f ( buf, n );
    for ( int i = 0; i < n; i++ )
    {
        printf ( "%d", buf[i] );
    }
    return 0;
}

使用相同的命令行将产生一堆可怕的 AVX2 代码。 (记住除以常数被重写为shift+m​​ul+add,它可以向量化!)

编辑2: 感谢@user2722968!应用 RCPPS 将使程序运行得更快。

这是我使用 RCPPS 进行快速恒定股息除法的实验实现:

https://github.com/ThinerDAS/didactic-spoon/blob/master/div.c https://github.com/ThinerDAS/didactic-spoon/blob/master/div.c

但是,我不确定如何在不产生大量开销的情况下使其更准确。


如果您可以触发“除以”的非常好的优化,那么您可能会从计算倒数中受益x/33659使用 RCPPS 指令(它确实使用 SSE/AVX)。

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

如何优化分配恒定股息? 的相关文章

  • 为什么在 C# 中成员初始值设定项中不允许这样做,但在 VB.Net Me 中允许

    我正在将 VB Net 应用程序转换为 C 并注意到在 VB Net 代码中 有一个私有成员变量 它是使用Me像这样 Private m ClassA As New MyCollection Of ClassA Me 当我将其转换为 C 代
  • 用 C# 启动 Windows 服务

    我想启动一个刚刚安装的Windows服务 ServiceBase ServicesToRun if bool Parse System Configuration ConfigurationManager AppSettings RunSe
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • gtest 和 gmock 有什么区别?

    我试图理解的目的google mock Google 的 C 模拟框架 https github com google googletest blob master googlemock README md 我已经与gtest较早 但我还是
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 使用 Selenium for C# 登录 Facebook

    我一直在使用 Selenium C 框架并尝试进行 facebook 登录 但没有任何运气 这是我到目前为止得到的 基于这篇文章 使用 Selenium 测试 Facebook Connect 应用程序 https stackoverflo
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 删除队列中的最后一个元素

    我需要删除队列的最后一个元素 我唯一可以使用的操作是 Peek 获取第一个元素而不删除它 Enqueue element 向队列末尾插入一个元素 Dequeue 删除第一个元素 IsEmpty true 或 false 队列是否为空 而且我
  • 使用互斥锁来阻止临界区外部的执行

    我不确定我的术语是否正确 但这里是 我有一个由多个线程使用的函数来写入数据 在注释中使用伪代码来说明我想要的内容 these are initiated in the constructor int data std atomic
  • Active Directory UserPrincipal.Current.GetGroups() 返回本地组而不是 Web 服务器上的组

    以下内容在我的本地开发盒上效果很好 但是 当我将其移动到网络服务器时 它失败了 甚至不会记录错误 public static List
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • 需要使用 openssl 加密和解密文件的示例 C 代码

    我正在用 Linux C 编写代码 我需要使用以下命令来加密和解密文件 openssl 目前 我使用系统命令 des3 e nosalt k 0123456789012345 in inp file out out file 进行加密 使用
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value
  • 在代码中而不是 XAML 中呈现 UserControl

    我想用RenderTargetBitmap将 UserControl 呈现为位图 而无需为其编写 XAML 当我这样做时 我得到一张空白图像 我是否错过了关键的一步 ValTool Controls VideoFisheyeOverlayC
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • 如何修复 GIT 错误:HEAD:无效的引用日志条目 xxxxxxxxxxxxxxxx

    我之前遇到过错误 GIT错误 目标文件为空 然后我使用了中提到的方法如何修复 GIT 错误 目标文件为空 https stackoverflow com questions 11706215 how to fix git error obj
  • 以循环模式使用 tomcat

    我想在配置中运行我的 tomcat 实例 其中通过循环将请求提供给多个 tomcat 实例 我不想使用任何内部集群管理器 据我所知 如果每个请求都由不同的tomcat提供服务 则未知的sessionId将到达tomcat 因此它将被迫创建一
  • GKE:修改现有集群 - 删除节点标签并更改网络

    我使用以下 CLI 命令创建了 Kubernetes 集群 gcloud container clusters create some cluster tags some tag network some network 我现在想 禁用 t
  • R:使用 cat() 获得类似 Unix 的换行符 LF 写入文件

    我尝试将字符向量写入 Windows 7 R 3 2 2 x64 下的文本文件 并且我想要 unix LF 到 Windows CRLF v lt c a b c cat nl file textfile txt sep n writes
  • DestinationViewController Segue 和 UINavigationController swift

    所以我有一个像这样的prepareForSegue方法 override func prepareForSegue segue UIStoryboardSegue sender AnyObject if segue identifier f
  • 使用 TripleDes、PKCS7 和 ECB 进行 PHP 加密/解密

    我的加密函数工作正常 但是我不知道如何让解密函数给出正确的输出 这是我的加密函数 function Encrypt data secret Generate a key from a hash key md5 utf8 encode sec
  • Zipalign - 未找到命令 - MAC 终端

    当我尝试在 apk 上运行 Zipalign 时 出现错误 Command not found 我不太熟悉在 MAC 上使用终端命令 但我已导航到 SDK Tools 文件夹并运行以下命令 zipalign v 4 Project1 apk
  • 将 Swift 与 Qt 结合使用

    我们可以很容易地使用Qt 中的 Objective C 和 C https stackoverflow com questions 23404158 qt run object c code 23404257 23404257 观看了 Ap
  • jQuery:动画后 div 弹回完整尺寸

    在下面的 jQuery 示例中 我将一个 div 放在另一个 div 中 当我将内部 div 的宽度设置为 0 时 外部 div 具有绝对定位 的宽度也会随之减小 这是所希望的 问题是 动画完成后 外部 div 会弹回到原来的大小 这是预期
  • Adobe AIR - 带图像的自定义预加载器

    Folks 我设计了一个Adobe AIR应用 我想展示一些preloader在它打开之前 任何人都可以指导我的教程preloader 专门针对 AIR或者任何已经内置的 Thanks 借助 AIR 我可以想出几种方法来实现这一目标 1 使
  • 无法解决此引用错误

    我一直在编写一个程序 在程序中我必须压缩一些文件 所以我使用了一个名为 Ionic Zip 的插件 当我运行我的程序时 它完全正常 没有错误 但是现在当我在完成编写后尝试构建我的程序时 出现以下错误 Code Warning 1 Could
  • Wcf服务继承(扩展服务)

    我正在开发的程序使用 wcf 公开回调和服务 基本上 服务所做的只是返回一些变量值 至于回调 他们只是更新这些变量 我希望能够公开一个仅包含服务的类以及一个包含服务和回调的类 例如 ServiceContract ServiceBehavi
  • 在带有环回后端的 Angular 应用程序中通过 facebook 登录

    我正在使用 Strongloop 环回后端制作一个有角度的应用程序 我还使用环回护照模块通过 facebook 集成了第三方登录 Loopback example passport 中的一切都很好 并且在重定向到我的应用程序之前 我的应用程
  • 如何获取 PowerShell 脚本的文件系统位置?

    我有一个 PowerShell 脚本位于D temp 当我运行此脚本时 我希望列出文件的当前位置 我该怎么做呢 例如 此代码将在 DOS 批处理文件中完成它 我正在尝试将其转换为 PowerShell 脚本 FOR f usebackq t
  • 匹配 SHA1 的正则表达式

    我正在尝试将通用文本中的 SHA1 与正则表达式进行匹配 理想情况下 我想避免匹配单词 可以肯定地说 完整的 SHA1 具有独特的模式 它们很长且长度一致 因此我可以可靠地匹配它们 但缩写的 SHA1 又如何呢 我可以依赖数字的存在吗 查看
  • 发出蜂鸣声直到有任何输入

    我正在制作一个测验程序 所以我想要的是 每当用户提出任何问题时 他都有 30 秒的时间来回答 在这 30 秒内 我希望每隔 1 秒发出一次嘟嘟声 a 现在我想要的是 一旦用户输入任何输入 这种蜂鸣声就应该停止 我创建了这个小函数来产生 30
  • 玩:如何从 JSON 中删除没有值的字段并用它们创建一个新的 JSON

    给定以下 JSON field1 value1 field2 field3 value3 field4 如何获取两个不同的 JSON 一个包含有值的字段 另一个包含没有值的字段 最终结果应如下所示 field1 value1 field3
  • 一组值的所有可能分组的数量?

    我想找到一个组合公式 给定一定数量的整数 我可以找到这些整数的所有可能分组的数量 这样所有值都属于一个组 假设我有 3 个整数 1 2 3 将有 5 组 1 2 3 1 2 3 1 2 3 1 2 3 2 1 3 我已经通过计算计算了 N
  • 启动 hadoop 流作业的替代方法

    我可以从终端成功启动 hadoop 流作业 但我正在寻找通过 api eclipse 或其他方式启动流作业的方法 我发现的最接近的是这篇文章https stackoverflow com questions 11564463 remotel
  • 如何优化分配恒定股息?

    优化为除以众所周知 gcc 对常量进行了很好的优化 现在我想知道如何dividing常数被优化 gcc 不能帮助我 clang 也是如此 也许我不擅长搜索这些信息 但我找不到关于优化的材料除常数 相比之下 除以常数介绍得很好 include