limit 关键字在 gcc/g++ 中是否提供了显着的好处?

2024-05-03

有没有人见过关于是否使用 C/C++ 的任何数字/分析restrictgcc/g++ 中的关键字实际上在现实中(而不仅仅是理论上)提供了任何显着的性能提升?

我读过各种推荐/贬低其使用的文章,但我还没有遇到任何实际数字可以证明双方的论点。

EDIT

我知道restrict不是 C++ 的正式一部分,但它受到一些编译器的支持,我读过一篇论文克里斯特·埃里克森 http://realtimecollisiondetection.net/强烈建议使用它。


limit 关键字有不同的作用。

在某些情况下(图像处理),我已经看到了 2 倍甚至更多的改进。大多数时候,差异并没有那么大。大约10%。

这是一个说明差异的小例子。我编写了一个非常基本的 4x4 矢量 * 矩阵变换作为测试。请注意,我必须强制该函数不被内联。否则,GCC 会检测到我的基准代码中没有任何别名指针,并且由于内联而限制不会产生影响。

我也可以将转换函数移动到不同的文件中。

#include <math.h>

#ifdef USE_RESTRICT
#else
#define __restrict
#endif


void transform (float * __restrict dest, float * __restrict src, 
                float * __restrict matrix, int n) __attribute__ ((noinline));

void transform (float * __restrict dest, float * __restrict src, 
                float * __restrict matrix, int n)
{
  int i;

  // simple transform loop.

  // written with aliasing in mind. dest, src and matrix 
  // are potentially aliasing, so the compiler is forced to reload
  // the values of matrix and src for each iteration.

  for (i=0; i<n; i++)
  {
    dest[0] = src[0] * matrix[0] + src[1] * matrix[1] + 
              src[2] * matrix[2] + src[3] * matrix[3];

    dest[1] = src[0] * matrix[4] + src[1] * matrix[5] + 
              src[2] * matrix[6] + src[3] * matrix[7];

    dest[2] = src[0] * matrix[8] + src[1] * matrix[9] + 
              src[2] * matrix[10] + src[3] * matrix[11];

    dest[3] = src[0] * matrix[12] + src[1] * matrix[13] + 
              src[2] * matrix[14] + src[3] * matrix[15];

    src  += 4;
    dest += 4;
  }
}

float srcdata[4*10000];
float dstdata[4*10000];

int main (int argc, char**args)
{
  int i,j;
  float matrix[16];

  // init all source-data, so we don't get NANs  
  for (i=0; i<16; i++)   matrix[i] = 1;
  for (i=0; i<4*10000; i++) srcdata[i] = i;

  // do a bunch of tests for benchmarking. 
  for (j=0; j<10000; j++)
    transform (dstdata, srcdata, matrix, 10000);
}

结果:(在我的 2 Ghz Core Duo 上)

nils@doofnase:~$ gcc -O3 test.c
nils@doofnase:~$ time ./a.out

real    0m2.517s
user    0m2.516s
sys     0m0.004s

nils@doofnase:~$ gcc -O3 -DUSE_RESTRICT test.c
nils@doofnase:~$ time ./a.out

real    0m2.034s
user    0m2.028s
sys     0m0.000s

执行速度比拇指快 20%that system.

为了显示它在多大程度上取决于架构,我让相同的代码在 Cortex-A8 嵌入式 CPU 上运行(稍微调整了循环计数,因为我不想等待那么久):

root@beagleboard:~# gcc -O3 -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp test.c
root@beagleboard:~# time ./a.out

real    0m 7.64s
user    0m 7.62s
sys     0m 0.00s

root@beagleboard:~# gcc -O3 -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -DUSE_RESTRICT test.c 
root@beagleboard:~# time ./a.out

real    0m 7.00s
user    0m 6.98s
sys     0m 0.00s

这里的差异仅为 9%(顺便说一句,相同的编译器。)

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

limit 关键字在 gcc/g++ 中是否提供了显着的好处? 的相关文章

  • mfence 和 asm 易失性 ("" : : : "内存") 的区别

    据我了解 mfence是硬件内存屏障 而asm volatile memory 是编译器障碍 但是 可以asm volatile memory 用来代替 mfence 我感到困惑的原因是这个链接 http gcc gnu org ml gc
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 在react-query中使用(isLoading或isFetching)的原因

    我是一个使用react的用户 我在使用react query时没有很好地使用isloading函数 在ui方面 我认为正在加载用于向用户显示加载屏幕 我认为我不必显示加载 因为数据获取速度很快 但突然 我想到了这个想法 如果你把 props
  • Selenium RC:如何检查元素是否具有给定属性?

    我有一些带有onclick属性和一些没有属性 我想检查指定的元素是否具有onclick属性 我怎样才能做到这一点 getAttribute 当有属性值时返回该属性值 如果没有 它会抛出 RuntimeException 并停止测试 即使我将
  • Owncloud上传文件到特定文件夹-curl

    我想通过我自己的云服务器上的特定文件夹中的curl上传文件 例如 http www myowncloudserver com remote php webdav MY FOLDER 目前我无法将文件上传到我自己的云服务器上的文件夹 有任何想
  • ASP.NET 列表视图->单击行->执行操作

    我需要以下方面的帮助 我有一个用隐藏代码填充的列表视图 Linq gt Sql ListView1 DataSource from x in database ITEMS select x ListView1 DataBind 项目内容 I
  • Python打开Microsoft SQL Server MDF文件

    如何在 Python 中打开 Microsoft SQL Server MDF 文件 Edit 我试过了pyodbc connect但这需要合法的 服务器连接 您不能简单地打开 MDF 文件 pyodbc connect driver SQ
  • 如何在 C# 中的 HttpClient 中使用凭据?

    我在使用 HttpClient 类访问 Delicious API 时遇到一些问题 我有以下代码 try const string uriSources https api del icio us v1 tags bundles all p
  • ASP.Net Core,检测控制器中的调试与不调试

    我正在编写我的第一个 ASP Net 代码 Web 应用程序 在我的控制器中我希望有一个if检查我是否处于调试模式的语句 我知道在 Startup cs 文件中我可以检查env IsDevelopment 但那是因为IHostingEnvi
  • 多维数组到数据框

    R 中的以下问题对你们中的许多人来说可能看起来很简单 但由于我对此相对较新 如果您能帮助我 那将非常有帮助 我想本质上编写一个多维 3 个维度 数组作为我可以更轻松地操作的数据框 我正在处理 1891 年 1 月 1 日至 2015 年 1
  • 使用 Google App Engine 和 ndb 时是否见过重复的 ID?

    class Entries ndb Model description ndb StringProperty seqid ndb IntegerProperty link ndb StringProperty group ndb Strin
  • 使用位图的保存方法覆盖图像

    我有一个 ASP NET C 页面 我正在其中调整文件夹中图像的大小 我正在使用 GDI 来执行此操作 我想调整图像大小并替换为旧图像 因此 当我尝试使用现有名称保存时 Save 方法会抛出错误 但如果我给出不同的名称 它就会被保存 但我希
  • TEdit onclick 全选?

    每当用户单击 TEdit1 或单击选择其中的某些文本时 如何选择 TEdit1 的所有文本 执行超出默认行为的任何操作都可能非常危险TEdit控制 您的用户知道标准 Windows 控件的行为方式 任何偏离此的行为都可能导致混乱 默认情况下
  • 在 ggplot2 facet_wrap 标签上使用半填充的正方形

    我正在尝试使用标签上的一半 以及四分之一填充 方块来生成 ggplot2 图表 但 Mac 上的 ggplot2 似乎不支持某些符号 例如 当我输入 print u25E9 它显示一个半黑的正方形 但是当我尝试在 ggplot 中使用它时
  • 如何检查一组行中是否至少有一个具有特定值

    我需要找到属于满足特定条件的任何组的所有行 我将组定义为共享 组 列中的值的几行 相关组必须至少包含一行且 Eligible 设置为 true 并且该组中至少有两行在 Group 或 Eligible 以外的任何列中必须彼此不同 示例表 G
  • 为什么 ThreadLocal 实用程序在 Spring MVC 应用程序中总是返回 null?

    我编写了这个实用程序类来在 Spring MVC 应用程序中保存临时数据 public abstract class FooUtil private static final ThreadLocal
  • 对 python 2.7 的支持结束了吗?

    是否有一个已知的日期 时间范围 将不再支持 python 2 7 转而支持 python 3 截至 2014 年 4 月 13 日 从http hg python org peps rev 76d43e52d978 http hg pyth
  • ruby 1.9 如何将数组转换为不带括号的字符串

    我的问题是关于如何在 ruby 1 9 中将数组元素转换为字符串而不需要括号和引号 我有一个数组 数据库提取 我想用它来创建定期报告 myArray Apple Pear Banana 2 15 12 在 ruby 1 8 中我有以下行 r
  • 如何让iOS 7下的UISwitch不采用其后面视图的背景颜色?

    关闭时看起来像这样 虽然我更喜欢灰色背景 我真的必须使用 UIImageView 吗 以下是我更改 iOS7 UISwitch 的填充颜色的方法 首先您需要导入 QuartzCore import
  • C++中的引用类型是POD类型吗?

    C 中的引用类型也是POD类型吗 是int 是POD类型吗 那么呢 struct Q int i 有人可以帮助我吗 No 设置引用某些内容的成员的唯一方法是通过用户声明的构造函数 因此 您的结构是非 POD 的 Update 答案仍然是否定
  • 如何检查并关闭Excel文件是否已在Java中打开[重复]

    这个问题在这里已经有答案了 可能的重复 Java 检查文件是否已打开 https stackoverflow com questions 1390592 java check if file is already open 我正在制作一个
  • limit 关键字在 gcc/g++ 中是否提供了显着的好处?

    有没有人见过关于是否使用 C C 的任何数字 分析restrictgcc g 中的关键字实际上在现实中 而不仅仅是理论上 提供了任何显着的性能提升 我读过各种推荐 贬低其使用的文章 但我还没有遇到任何实际数字可以证明双方的论点 EDIT 我