Swift-iOS中的交叉积
我想在两个向量R^n之间做一个叉积,有没有最优化的方法 我看了图书馆,但还是什么也找不到 当且仅当n=0、1、3或7时,Rn中可以存在叉积 资料来源: 所以不,你肯定找不到任何这样的图书馆。如果您的意思是元素方面的,那么可以使用Accelerate。下面是一个简短的测试:Swift-iOS中的交叉积,ios,arrays,xcode,swift,optimization,Ios,Arrays,Xcode,Swift,Optimization,我想在两个向量R^n之间做一个叉积,有没有最优化的方法 我看了图书馆,但还是什么也找不到 当且仅当n=0、1、3或7时,Rn中可以存在叉积 资料来源: 所以不,你肯定找不到任何这样的图书馆。如果您的意思是元素方面的,那么可以使用Accelerate。下面是一个简短的测试: import Accelerate let n = 10_000_000 let a = (0..<n).map{ _ in Double(arc4random()) / Double(UInt32.max) } l
import Accelerate
let n = 10_000_000
let a = (0..<n).map{ _ in Double(arc4random()) / Double(UInt32.max) }
let b = (0..<n).map{ _ in Double(arc4random()) / Double(UInt32.max) }
print("A: [\(a.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
print("B: [\(b.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
var result = [Double](count: n, repeatedValue: 0)
let start = mach_absolute_time()
vDSP_vmulD(a, 1, b, 1, &result, 1, UInt(n))
let stop = mach_absolute_time()
let time = Double(stop - start) / Double(NSEC_PER_SEC)
print("Time: \(time) for \(n) elements")
print("Result: [\(result.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
1000万个元素的0.024秒相当快
当且仅当n=0、1、3或7时,Rn中可以存在叉积
资料来源:
所以不,你肯定找不到任何这样的图书馆。如果您的意思是元素方面的,那么可以使用Accelerate。下面是一个简短的测试:
import Accelerate
let n = 10_000_000
let a = (0..<n).map{ _ in Double(arc4random()) / Double(UInt32.max) }
let b = (0..<n).map{ _ in Double(arc4random()) / Double(UInt32.max) }
print("A: [\(a.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
print("B: [\(b.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
var result = [Double](count: n, repeatedValue: 0)
let start = mach_absolute_time()
vDSP_vmulD(a, 1, b, 1, &result, 1, UInt(n))
let stop = mach_absolute_time()
let time = Double(stop - start) / Double(NSEC_PER_SEC)
print("Time: \(time) for \(n) elements")
print("Result: [\(result.prefix(10).map{ "\($0)" }.joinWithSeparator(", ")), ...]")
1000万个元素0.024秒的并行执行速度相当快
如果您正在寻找Elementwise产品操作
a=(1.0,2.0)
b=(3.0,4.0)
a*b=(a1*b1,a2*b2)=(3.0,8.0)
如果您想要在iOS上获得尽可能快的性能,您应该使用simd
框架(单指令多数据)
为什么simd这么快?
如果没有simd,计算a*b
将需要执行两个步骤
a1*b1
并将结果放入res1
a2*b2
并将结果放入res2
simd
这两个操作是并行完成的。这是可能的,因为这两个步骤的操作相同,数据不同。这正是simd
所允许的
更多
从
单指令多数据(SIMD)是Flynn分类法中的一类并行计算机。它描述了具有多个处理元件的计算机,这些处理元件在多个数据点上同时执行相同的操作
因此,这类机器利用数据级并行性,但不利用并发性:有同时(并行)计算,但在给定时刻只有一个进程(指令)
SIMD特别适用于常见任务,如调整数字图像的对比度或调整数字音频的音量
大多数现代CPU设计都包含SIMD指令,以提高多媒体使用的性能
并行执行
如果您正在寻找Elementwise产品操作
a=(1.0,2.0)
b=(3.0,4.0)
a*b=(a1*b1,a2*b2)=(3.0,8.0)
如果您想要在iOS上获得尽可能快的性能,您应该使用simd
框架(单指令多数据)
为什么simd这么快?
如果没有simd,计算a*b
将需要执行两个步骤
a1*b1
并将结果放入res1
a2*b2
并将结果放入res2
simd
这两个操作是并行完成的。这是可能的,因为这两个步骤的操作相同,数据不同。这正是simd
所允许的
更多
从
单指令多数据(SIMD)是Flynn分类法中的一类并行计算机。它描述了具有多个处理元件的计算机,这些处理元件在多个数据点上同时执行相同的操作
因此,这类机器利用数据级并行性,但不利用并发性:有同时(并行)计算,但在给定时刻只有一个进程(指令)
SIMD特别适用于常见任务,如调整数字图像的对比度或调整数字音频的音量
大多数现代CPU设计都包含SIMD指令,以提高多媒体使用的性能
我相信您正在寻找GLKit:它本身就支持向量乘法。还有多个第三方库:例如,我相信您正在寻找GLKit:它本身就支持向量乘法。还有多个第三方库:例如,
import simd
let v0 = float2(1.0, 2.0)
let v1 = float2(3.0, 4.0)
let res = v0 * v1
print(res) // float2(3.0, 8.0)