通用SIMD数学

时间:2019-06-05 17:58:47

标签: swift generics simd

我目前正在尝试创建一个可以用浮点数组(并且可能还会翻倍)初始化的类,该浮点数组将存储为上述大小的SIMD向量(float2,float4等)

我想知道的是,是否有可能计算通用向量而不必为每种大小和标量类型创建函数?

我不必为每种类型编写单独的类,而是尝试使用泛型,就像这样

public class GenericSIMD<T: SIMD>: NSObject {
    var inputVector: T!

    convenience init(_ input: [T.Scalar]) {
        self.init()

        self.inputVector = T(input)
    }

    public func multiply (_ input: [T.Scalar]) -> T.Scalar {
        guard let inVec = self.inputVector else { return 0 as! T.Scalar }

        let vector = T(input)
        return inVec * vector
    }

    public func multiply (_ input: [T.Scalar]) -> T.Scalar {
        guard let inVec = self.inputVector else { return 0 as! T.Scalar }

        let vector = T(input)
        return simd_dot(vector, inVec)
    }

    private override init() {
        super.init()
    }
}

// Usage
let generic = GenericSIMD<SIMD4<Float>>([2, 4, 5, 2])
print(generic.multiply([2, 5, 1, 2]))

虽然我可以无问题地存储向量,但在return inVec * vector上却报错

  

无法推断出通用参数'T'

我在return simd_dot(vector, inVec)上也遇到了一个错误,指出了这一点

  

不能使用类型为((T,T)''的参数列表调用'simd_dot'

0 个答案:

没有答案