CPU 相关代码:如何避免函数指针?

2024-01-03

我为多个 CPU 编写了性能关键的代码。我在运行时检测 CPU,并基于此为检测到的 CPU 使用适当的函数。所以,现在我必须使用函数指针并使用这些函数指针调用函数:

void do_something_neon(void);
void do_something_armv6(void);

void (*do_something)(void);

if(cpu == NEON) {
    do_something = do_something_neon;
}else{
    do_something = do_something_armv6;
}

//Use function pointer:
do_something(); 
...

这并不重要,但我要提到的是,我针对不同的 cpu 优化了功能:支持 NEON 的 armv6 和 armv7。问题是,通过在许多地方使用函数指针,代码会变得更慢,我想避免这个问题。

基本上,在加载时链接器会使用函数地址解析重新定位和修补代码。有没有办法更好地控制这种行为?

就个人而言,我建议两种不同的方法来避免函数指针:为 cpu 相关函数创建两个单独的 .so (或 .dll),将它们放在不同的文件夹中,并根据检测到的 CPU 将这些文件夹之一添加到搜索路径(或LD_LIB_路径)。加载主代码和动态链接器将从搜索路径中选取所需的dll。另一种方法是编译两个单独的库副本:) 第一种方法的缺点是它迫使我至少拥有 3 个共享对象 (dll):两个用于 cpu 相关函数,一个用于使用它们的主代码。我需要 3 个,因为我必须能够在加载使用这些 cpu 相关函数的代码之前进行 CPU 检测。第一种方法的优点是应用程序不需要为多个 CPU 加载相同代码的多个副本,它只会加载将要使用的副本。第二种方法的缺点相当明显,无需多言。

我想知道是否有一种方法可以在不使用共享对象并在运行时手动加载它们的情况下做到这一点。其中一种方法是一些涉及在运行时修补代码的黑客技术,它可能太复杂而无法正确完成)。有没有更好的方法来控制加载时的重定位?也许将与 cpu 相关的函数放在不同的部分中,然后以某种方式指定哪个部分具有优先级?我觉得MAC的男子气概也有类似的东西。

仅 ELF(针对arm目标)解决方案对我来说就足够了,我并不真正关心PE(dll)。

thanks


您可能想要查找 GNU 动态链接器扩展STT_GNU_IFUNC。添加时来自 Drepper 的博客:

因此,我设计了一个 ELF 扩展,它允许决定每个进程运行一次使用哪个实现。它是使用新的 ELF 符号类型 (STT_GNU_IFUNC) 实现的。每当符号查找解析为这种类型的符号时,动态链接器不会立即返回找到的值。相反,它将值解释为指向函数的函数指针,该函数不带参数并返回要使用的实际函数指针。所调用的代码可以在实现者的控制之下,并且可以基于实现者想要使用的任何信息来选择使用两个或更多个实现中的哪一个。

Source: http://udrepper.livejournal.com/20948.html http://udrepper.livejournal.com/20948.html

尽管如此,正如其他人所说,我认为您对间接调用对性能的影响是错误的。共享库中的所有代码都将通过 GOT 中的(隐藏)函数指针和加载/调用该函数指针的 PLT 条目来调用。

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

CPU 相关代码:如何避免函数指针? 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 子目录中的头文件(例如 gtk/gtk.h 与 gtk-2.0/gtk/gtk.h)

    我正在尝试使用 GTK 构建一个 hello world 其中包括以下行 include
  • 用于连接 DataTable 上的动态列的动态 LINQ

    我目前遇到的情况不确定如何继续 我有两个从数据库填充的数据表 我还有一个可用的列名称列表 可用于将这两个数据表连接在一起 我希望编写一组 LINQ 查询 这些查询将 显示两个数据表中的行 内部联接 用于从一个数据表更新另一个数据表 显示一个
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 使用 OleDbCommandBuilder 时访问 SQL 语法错误

    我要在 C 中使用 OleDbDataAdapter 在 Access 数据库中插入数据 但收到错误消息INSERT INTO 命令中的语法错误 BackgroundWorker worker new BackgroundWorker Ol
  • C++ 到 C# 事件处理

    所以我有我的C WinForm 应用程序 我从中调用我的C CLI MFC dll图书馆 但也有一些events在我的 C 库上 甚至此事件也发生在该库的本机 非 CLI 部分 我需要从我的 C 应用程序调用一些代码 并获取一些有关此事件的
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • ALTER TABLE ... ADD CONSTRAINT 失败时将事务回滚到保存点

    有没有办法在事务中添加检查约束and如果失败回滚到以前的保存点 而不是回滚整个事务 就我而言 当 ALTER TABLE ADD CONSTRAINT 命令失败时 事务无法回滚到保存点 尝试这样做会引发 InvalidOperationEx
  • 为什么 f(i = -1, i = -1) 是未定义的行为?

    我正在读关于违反评估顺序 http en cppreference com w cpp language eval order 他们举了一个令我困惑的例子 1 如果标量对象上的副作用相对于同一标量对象上的另一个副作用是无序的 则行为未定义
  • 无法在 C# 中为 EventArgs 分配使用派生类型的事件处理程序

    所以我有一个事件声明如下 public event EventHandler OnChangeDetected 然后我有以下处理程序被分配给该事件 myObject OnChangeDetected OnTableChanged 我的理解是
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • C 语言中的 Alpha 混合 2 RGBA 颜色[重复]

    这个问题在这里已经有答案了 可能的重复 如何快速进行阿尔法混合 https stackoverflow com questions 1102692 how to do alpha blend fast 对 2 个 RGBA 整数 颜色进行
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 如果“嵌入式”SQL 2008 数据库文件不存在,如何创建它?

    我使用 C ADO Net 和在 Server Management Studio 中创建的嵌入式 MS SQL 2008 数据库文件 附加到 MS SQL 2008 Express 创建了一个数据库应用程序 有人可以向我指出一个资源 该资

随机推荐

  • 将单元格拆分为不同数量的单元格 - Excel

    如果回答了类似的问题 我们深表歉意 我进行了搜索 但找不到我要找的东西 我有一个电子表格 在其中复制并粘贴了有关各种类型啤酒的大量数据 我想将包含文本的字符串单个单元格拆分为与啤酒类型和酒精百分比相对应的任意数量的单元格 我遇到的问题是 有
  • 每(x)个JAVA插入一个空格,使用正则表达式

    我想知道正则表达式是否可以做到这一点 或者我应该将其分成一个字符数组并执行循环 在他们输入的字符串中每隔 x 个字符 由用户指定 插入一个空格 例如 他们有字符串 oogabooga 他们首先想每 2 个字符插入一个空格 他们会得到 oo
  • 使用 Retrofit 将 JSON 属性简单自定义映射到对象属性

    在 RetroFit 中定义 JSON 属性到特定对象属性的自定义映射的最简单方法是什么 一组 奖励 的 JSON 响应示例 name 5 Voucher description Get 5 off your next purchase a
  • 授予 Kubernetes 服务帐户权限以从所有命名空间获取 pod

    我想授予 Kubernetes 服务帐户执行权限kubectl token token get pod all namespaces 我熟悉对单个名称空间执行此操作 但不知道如何对所有名称空间执行此操作 包括将来可能创建的新名称空间且无需授
  • vim表格插件问题

    Before stallone Factory user name gt Sylvester age gt 64 schwarzenegger Factory user name gt Arnold age gt 63 一些魔法 After
  • 如何在 ReSharper 中添加自定义代码分析

    我是 ReSharper 的新手 对于使用Resharper的人来说 有没有办法添加自定义代码分析规则 例如我可能有一条规则说所有私有变量都应以字母 m 开头 如何将其添加到 Resharper 以便如果我违反此规定 它可以显示为警告或错误
  • BFS 和 DFS 的区别

    我正在读关于DFS in 算法简介由科门 以下为正文 片段 与 BFS 不同 BFS 的前驱子图形成一棵树 DFS产生的subgrpah可能由几棵树组成 因为 可以从多个来源重复搜索 除上述注释外 还提到以下内容 BFS 仅限于一个源 这似
  • 只需要“最近”任务 - 取消/忽略的最佳实践?

    我有一个看起来像这样的任务 var task Task Factory StartNew LongMethod task ContinueWith TaskCallback TaskScheduler FromCurrentSynchron
  • 连接超时已过期。登录后阶段超时时间已过

    在我的应用程序中 查询工作正常 对于单个选择查询 我收到以下错误 System Data EntityException 底层提供程序在打开时失败 gt System Data SqlClient SqlException 连接超时已过期
  • 将 React-Redux 与 connect() 和 {...this.props} 一起使用

    当我想从其他组件调用容器中的操作时 我无法弄清楚如何制定正确的解决方案 顺便说一句 我想使用扩展运算符 因为我需要在组件中传递太多参数并且不想描述他们全部 我知道我可以通过 props 从 redux store 传递所有 props 就像
  • iOS5/6 中自动旋转?

    我更新到 Xcode 4 5 并正在使用 iOS6 这是一个我肯定会犯的错误not下次有更新时进行 对于刚接触 iOS 的人来说 这有点像噩梦 而且我刚刚注意到我正在开发的一个应用程序正在自动旋转 我在更新之前从未注意到它会自动旋转 但也有
  • 检索每个 OWL 的 unionOf 和 junctionOf 的集合

    我正在尝试提取intersectionOf and unionOf在 OWL 文件中 其中interesctionOf and unionOf由类的集合组成 someValuesFrom or and onProperty 我创建了一个 S
  • 如何在网站的网页之间传递信息

    我有这个网站 我经常发现自己试图将信息从一个网页传递到下一个网页 最好的方法是什么 会话几乎是最好的选择吗 因为如果我需要传递大量信息怎么办 然后呢 我想你有几种可能的解决方案 Use cookies to store all data w
  • IllegalArgumentException:必须至少存在一个 JPA 元模型

    从弹簧休息开始时 我收到以下错误 gt org springframework beans factory BeanCreationException Error gt creating bean with name jpaMappingC
  • 什么是 CVS“pserver”模式?

    有人能准确地告诉我关于 CVS 的 pserver 模式是什么吗 pserver 这个术语经常被使用 但我还没有找到它到底是什么的解释 如果 pserver 是一种特殊模式 那么我假设也有一个默认模式 如果是这样 两者有什么区别 pserv
  • 停止 SoundPlayer 播放

    我正在尝试创建自己的小音板来播放 WAV 文件 现在播放不是问题 但我想要一种在需要时停止播放的方法 我想到了一个停止按钮 但不知道如何实现 所以我想到使用循环但它似乎不起作用 只是想知道是否有人可以帮助我哪里出了问题 或者这只是一种失败的
  • 如何递归使用 clojure.core/bean?

    所以我认为clojure core bean http clojuredocs org clojure core clojure core bean非常接近我想要的 但我正在使用一个具有嵌套 bean 的 Java 应用程序 这样我最终会得
  • 退出后返回箭头

    我有一个使用表单身份验证的 ASP NET 应用程序 当用户单击页面上的 注销 按钮时 它将运行以下代码 FormsAuthentication SignOut Response Expires 0 Response Cache SetNo
  • 通过代码设置壁纸

    我试图制作一个应用程序 它还可以让用户选择他想要设置的壁纸 我通过调用 Gallery Intent 来做到这一点 一旦用户选择了特定图像 图像的数据路径就会返回给我 然后我通过将图像设置到图像视图上来向用户预览 当图像尺寸 和 或分辨率
  • CPU 相关代码:如何避免函数指针?

    我为多个 CPU 编写了性能关键的代码 我在运行时检测 CPU 并基于此为检测到的 CPU 使用适当的函数 所以 现在我必须使用函数指针并使用这些函数指针调用函数 void do something neon void void do so