Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-iOS中的交叉积_Ios_Arrays_Xcode_Swift_Optimization - Fatal编程技术网

Swift-iOS中的交叉积

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

我想在两个向量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) }
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)