【发布时间】:2016-10-08 09:32:42
【问题描述】:
我正在使用来自 Apple 的 vecLib 和 Accelerate framework 作为动态库 + 我在基于 C lang 的项目和 Swift 游乐场中使用 C 和 Swift 3.0 代码。
并且在从 framework 的 SIMD 指令的 framework 调用 Apple 包装器的情况下,具有 1 个或 framework 的 vvcospif() 比简单的标准 @987654324 慢@当函数从循环中调用近 1000 次时为例。
我知道vvcospif() 和cos() 之间的区别,我应该完全使用vvcospif() 代替x * PI。
操场上的例子,你可以复制代码并运行它:
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 运行时比小 cos() 慢?
我也有 C 代码的性能问题 +
#include <Accelerate/Accelerate.h>
vvcospif(resultVector, inputVector, &count);
当 inputVector 和 resultVector 是具有 1 个或 2 个元素或只是浮点变量的小数组时,循环调用约 1.000.000 次。
cos(x * PI) 计算时间接近 20 毫秒。
和
vvcospif(x) 处理一个 float 或 float array[2] - 计算时间接近 80 毫秒!加速度在哪里? :)
是的,在 Xcode 中,我使用编译器 -O -whole-module-optimization 优化整个模块选项。已启用。
【问题讨论】:
-
我假设第一种方法中的
a + f(b - a)应该是a + f*(b - a)? – 我在 MacBook 上运行您的代码并得到以下时间:cosine_interpolate:0.74 毫秒,fast_cosine_interpolate:0.1 毫秒。 -
谢谢,这是带有 f * 动作的代码错误。在我的 mac mini 上: cosine_interpolate 在 0.461017966270447 秒内 fast_cosine_interpolate 在 0.545050024986267 秒内
-
-o设置输出文件名。-O3 -ffast-math启用全面优化。这是否可以解释您的时间比 Martin 慢 3 个数量级? -
不,我用 -O 更新了问题并修复了错误:在 Xcode 中选择了发布和调试的默认优化,这个结果也在默认的 Swift 3.0 和 Xcode 8、Sierra 操场上。在操场“项目”中,我无法选择优化标志...
-
vvcospif是一个 vForce 函数。 vForce 处理任意长度的向量,这会产生一些开销,因此不建议用于极短的向量。苹果自己recommends:“考虑在超过 16 个元素时使用 vForce”。对于标量使用,请考虑使用__cospi{f},根据已引用的来源,可从 iOS 7 和 OS X 10.9 获得。
标签: swift macos loops simd accelerate-framework