Я играю с кодом C и Swift 3.0, используя vecLib и Accelerate framework от Apple как динамическую библиотеку + мой код в проекте на основе C lang и Swift.
А в ситуации с вызовом обёртки Apple из framework SIMD-инструкции с 1 или ‹ 4 элементами вычислительная функция типа vvcospif()
из framework работает медленнее, чем простой стандартный cos(x * PI)
, когда функции вызываются из цикла рядом 1.000 раз в качестве примера.
Я знаю о разнице между vvcospif()
и cos()
, я должен использовать именно vvcospif()
вместо x * PI
.
Пример на игровой площадке, вы можете просто скопировать код и запустить его:
import Cocoa
import Accelerate
func cosine_interpolate(alpha: Float, a: Float, b: Float) -> Float {
let ft: Float = alpha * 3.1415927;
let f: Float = (1 - cos(ft)) * 0.5;
return a + f*(b - a);
}
var start: Date = NSDate() as Date
var interp: Float;
for index in 0..<1000 {
interp = cosine_interpolate(alpha: 0.25, a: 1.0, b: 0.75)
}
var end = NSDate();
var timeInterval: Double = end.timeIntervalSince(start);
print("cosine_interpolate in \(timeInterval) seconds")
func fast_cosine_interpolate(alpha: Float, a: Float, b: Float) -> Float {
var x: Float = alpha
var count: Int32 = 1
var result: Float = 0
vvcospif(&result, &x, &count)
let SINSIN_HALF_X: Float = (1 - result) * 0.5;
return a + SINSIN_HALF_X * (b - a);
}
start = NSDate() as Date
for index in 0..<1000 {
interp = fast_cosine_interpolate(alpha: 0.25, a: 1.0, b: 0.75)
}
end = NSDate();
timeInterval = end.timeIntervalSince(start);
print("fast_cosine_interpolate in \(timeInterval) seconds")
Мой вопрос:
Почему vvcospif()
работает медленно в этом примере?
Может быть, потому, что vvcospif()
это оболочка для среды выполнения Objective-C, а преобразование структур данных/копирование памяти из Intel SIMD -> Objective-C -> среда выполнения Swift медленнее, чем крошечная cos()
?
У меня также есть проблема с производительностью с кодом C +
#include <Accelerate/Accelerate.h>
vvcospif(resultVector, inputVector, &count);
когда inputVector
и resultVector
представляют собой небольшие массивы с 1 или 2 элементами или просто переменной с плавающей запятой и вызывают в цикле ~ 1 000 000 раз.
cos(x * PI)
время расчета около 20 мс.
а также
vvcospif(x)
с обработкой одного float
или float array[2]
- время расчета около 80 мс! Где Акселерация? :)
Да, в Xcode я использую оптимизацию компилятора -O -whole-module-optimization
с опцией всего модуля. включено.
a + f(b - a)
в первом методе должно бытьa + f*(b - a)
? – Я запустил ваш код на MacBook и получил следующие тайминги: cosine_interpolate: 0,74 миллисекунды, fast_cosine_interpolate: 0,1 миллисекунды. - person Martin R   schedule 08.10.2016-o
устанавливает имя выходного файла.-O3 -ffast-math
включает полную оптимизацию. Объясняет ли это, что ваше время на 3 порядка медленнее, чем у Мартина? - person Peter Cordes   schedule 08.10.2016vvcospif
— это функция vForce. vForce работает с векторами произвольной длины, что создает некоторые накладные расходы, поэтому не рекомендуется использовать его для очень коротких векторов. Сама Apple рекомендует: рассмотрите возможность использования vForce, когда более 16 элементов. Для скалярного использования рассмотрите возможность использования__cospi{f}
, доступного в iOS 7 и OS X 10.9 согласно уже цитированному источнику. - person njuffa   schedule 10.10.2016