Универсальный SIMD Math - PullRequest
       8

Универсальный SIMD Math

0 голосов
/ 05 июня 2019

В настоящее время я пытаюсь создать класс, который можно инициализировать с помощью массива чисел с плавающей точкой (и, возможно, также удваивается), который будет храниться как вектор 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) о том, что

Невозможно вызвать 'simd_dot' со списком аргументов типа '(T, T)'

...