我正在使用来自Apple的vecLib和 Accelerate framework的C和Swift 3.0代码作为基于C lang的项目和Swift playground中的动态库我的代码. 并且在使用1或者 SIMD指令的框架调用Apple的包装器的情况下.当函数
并且在使用1或者< SIMD指令的框架调用Apple的包装器的情况下.当函数从接近1.000次的循环调用时,来自框架的vvcospif()的4个元素计算函数比简单的标准cos(x * PI)慢. 我知道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运行时比tiny cos()慢吗?
我也有C代码的性能问题
#include <Accelerate/Accelerate.h> vvcospif(resultVector, inputVector, &count);
当inputVector和resultVector是带有1或2个元素的小数组或者只是float变量时,并且循环调用~1.000.000次.
cos(x * PI)计算时间接近20 ms.
和
vvcospif(x)处理一个float或float数组[2] – 计算时间接近80 ms!加速在哪里?
