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