- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 vecLib 和 Accelerate framework 来处理 C 和 Swift 3.0 代码来自 Apple 作为动态库 + 我在基于 C lang 的项目和 Swift playground 中的代码。
并且在从 SIMD 指令的 框架 调用 Apple 包装器的情况下,具有 1 或 < 4 个元素的计算函数,例如 框架 的 vvcospif()
例如,当函数从循环调用接近 1.000 次时,比简单的标准 cos(x * PI)
慢。
我知道 vvcospif()
和 cos()
之间的区别,我应该对 x 使用完全相同的
.vvcospif()
* PI
Playground 上的例子,你可以复制代码并运行它:
import Cocoa
import Accelerate
func cosine_interpolate(alpha: Float, a: Float, b: Float) -> Float {
let ft: Float = alpha * 3.1415927;
let f: Float = (1 - cos(ft)) * 0.5;
return a + f*(b - a);
}
var start: Date = NSDate() as Date
var interp: Float;
for index in 0..<1000 {
interp = cosine_interpolate(alpha: 0.25, a: 1.0, b: 0.75)
}
var end = NSDate();
var timeInterval: Double = end.timeIntervalSince(start);
print("cosine_interpolate in \(timeInterval) seconds")
func fast_cosine_interpolate(alpha: Float, a: Float, b: Float) -> Float {
var x: Float = alpha
var count: Int32 = 1
var result: Float = 0
vvcospif(&result, &x, &count)
let SINSIN_HALF_X: Float = (1 - result) * 0.5;
return a + SINSIN_HALF_X * (b - a);
}
start = NSDate() as Date
for index in 0..<1000 {
interp = fast_cosine_interpolate(alpha: 0.25, a: 1.0, b: 0.75)
}
end = NSDate();
timeInterval = end.timeIntervalSince(start);
print("fast_cosine_interpolate in \(timeInterval) seconds")
我的问题是:
vvcospif()
在这个例子中很慢?可能是因为 vvcospif()
它是 Objective-C 运行时下的包装器,转换数据结构/从 Intel SIMD 复制内存 -> Objective-C -> Swift 运行时比 tiny 慢 cos()
?
#include <Accelerate/Accelerate.h>
vvcospif(resultVector, inputVector, &count);
当 inputVector
和 resultVector
是具有 1 或 2 个元素的小数组或只是 float 变量时,并在循环中调用约 1.000.000 次。
cos(x * PI)
计算时间接近 20 毫秒。
和
vvcospif(x)
处理一个 float
或 float array[2]
- 计算时间接近 80 毫秒!加速在哪里? :)
是的,在 Xcode 中,我使用编译器 -O -whole-module-optimization
优化整个模块选项。启用。
最佳答案
有关示例的更详细讨论,请参阅 "Introduction to Fast Bezier (and Trying the Accelerate.framework)" .
第一个基本问题是非内联函数调用非常昂贵。如果您可以在性能关键代码中提供帮助,则您不希望函数调用。在模块中,编译器通常可以为您内联函数,并且可以为您内联部分 stdlib。但是当你开始跨越模块障碍时,Swift 通常无法优化调用。
SIMD 函数的要点是您以正确的格式设置所有数据,然后只调用一次。这样,函数调用的成本由您调用的 SIMD 优化代码弥补。
但请记住,您不必调用 Accelerate 来获得 SIMD 优化。编译器完全能够注意到您编写了一个循环并将其本身变成一个内联 SIMD 算法(并且它一直这样做)。所以对于很多简单的问题,编译器无论如何都会赢。想一想:如果调用计数为 1 的 vvcospif
比调用 cos
更快,他们难道不会以这种方式实现 cos
吗?
我没怎么玩过你的代码,但如果你想用 Accelerate 提高它的性能,你想考虑如何安排所有输入数据,这样你就可以调用 vvcospif
一次N 很大。在这种情况下,它很可能比循环快得多(因为 cos
不是微不足道的)。
如果您想要 Accelerate 在实践中的示例,以及您需要如何组织数据,请参阅 PinchText .这段代码基于最多 10 次实时触摸计算包含几千个字形的页面的偏移量,并带有动画(请参阅 PinchText.mov 了解结果的样子)。特别是查看 adjustViewPositions:count:forTouchPoint:
。请注意 count
很大,并且数据是在没有循环的情况下逐步转换的。即使将(非常昂贵的)ObjC 方法调用投入该方法也无关紧要,因为它只进行了一次。摆脱循环中的函数调用是性能编程的重要组成部分。
关于swift - 为什么有时 Apple Accelerate 框架很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39930829/
一直以来中国版Apple Watch心不支持心电图功能,不过近日Apple Watch心电图终于在国行版上线了!那么Apple Watch心国内版心电图要如何使用呢?下面一起来看看吧! App
我正在尝试将“使用 Apple 登录”添加到我现有的 App ID。检查启用它的选项后,显示以下弹出窗口:带有此消息: If you're enabling an App ID for the fir
我有一个并发症,可能需要每 5 分钟更新一次。这很容易总结为每天 120 次更新。有没有办法只在用户唤醒 watch 时更新? 最佳答案 我认为您的问题的答案是否,目前没有办法只在用户唤醒 watch
我们正在测试新 Sign in with Apple我们的应用程序的功能,并且在初始请求时,我们会提供用户的全名和电子邮件地址(如果用户启用了这些选项)。 但是在随后的请求中,此数据不仅提供 iden
在我的苹果 watch 扩展中,我想使用长按手势功能。是否有任何 api 等效于 UILongPressGestureRecognizer。我的要求是,在 watch 扩展上,我有表格想要长按单元格,
有没有办法以编程方式显示苹果 map 中多个点之间的路线,如谷歌地图? 最佳答案 正如 MKMapItem 文档所述: If you specify the MKLaunchOptionsDirect
我一直在互联网上关注很多教程来学习如何设置并发症。按预期设置并发症我没有问题。 直到初始时间线条目过期。 12 小时后,我不知道如何更新它以保持并发症的存在。我将在下面分享我拥有的所有内容,希望有人可
我看到一本书的描述...... 书上说 /^Apple/ 会匹配字符串开头有一个 Apple 的字符串。所以它将匹配 Apple Apple1 AppleApple AppleABC ...... 书
众所周知,您可以禁止从允许接收 Apple 通知的应用程序接收通知。但是有谁知道禁用是在本地进行的(忽略 Apple 发送到应用程序的通知),还是 Apple 停止从它的服务器向您发送通知? 最佳答案
我有一个 Apple id,我正在构建一个使用 Apple 推送通知服务的应用程序,但我对此有点困惑。 Apple 执行此过程是否收费?它可以在安装了我的应用程序的特定数量的设备上运行是否有任何限制?
我正在制作一个音频播放器应用。 在苹果的音乐应用中,如果音乐专辑或播客没有插图,则显示音符图像或播客图标图像而不是插图。 我想做同样的事情。 我可以在我的应用程序中使用苹果音乐应用程序中的图像吗? 苹
我有一个自定义框架,我正在归档以在另一个项目中使用。更新到 Xcode11 后,我在使用该框架的项目中收到以下错误。 找不到目标“x86_64-apple-ios-simulator”的模块“MyCu
我有一个在 iOS 上运行良好的应用程序,但是当使用催化剂运行时,如果我在 macOS 上滑动到另一个虚拟桌面,然后再返回大约 10 次,它会间歇性地崩溃。它主要发生在 UICollectionVie
我正在使用 Xcode 开发 Apple Watch 应用程序。我想在屏幕的左上角放置一些文本,与列出时间的位置相邻。 当我将标签向上拖动到屏幕的一部分时,它会自动向下对齐。 我看到大多数 Apple
我似乎找不到在哪里设置我的 Apple Watch 应用程序的产品名称。我确实看到了产品名称选项,但更新它没有任何作用。也看不到文档中的任何内容 最佳答案 为了让您的应用程序名称在 iPhone 上的
问题:如何在我的服务器产品的安装程序中安全地包含推送通知所需的 SSL 证书? 背景:Apple 推送通知要求客户端 SSL 证书位于向 Apple 发出调用的服务器上。 我的产品采用传统的客户端/服
我已经在我的网站上实现了 Sign In with Apple。但问题是它只适用于我开发者的 Apple ID。 我尝试在同一环境中使用我的个人 Apple ID,并且登录过程也运行良好。 但是,当真
我的苹果触摸图标中的白色背景变黑了??我的白色背景不透明。该图标有一个白色三角形、红色圆圈和黑色文本。我唯一能辨认出来的是白色三角形和红色圆圈。知道是什么导致了这种情况以及如何使图标保持白色背景吗?
我正在考虑制作一个使用加速度计的 watchOS2 应用程序。如果应用程序在后台运行,它是否仍然能够接收来自加速度计或 CMMotionManager 的输入? 最佳答案 只有当 watchOS2 应
我想切换 Apple App Loader 使用的 Apple ID。 我找不到更改应用程序本身使用的帐户的方法。谷歌搜索没有带来任何有用的信息。当我启动加载程序应用程序时,它给我一个错误:“...您
我是一名优秀的程序员,十分优秀!