Есть ли встроенное средство для ускорения или в другом месте для суммирования массива UInt32 с использованием ускоренных векторных операций?Swift SIMD или Accelerate Sum UInt32
ответ
Я полагаю, что вы хотите, чтобы ускорить функции, такие как
func scalarsum (_ test_array: [UInt32]) -> UInt32 {
var result : UInt32 = 0
for x in test_array {
result = result &+ x
}
return result
}
Так что, может быть, вы можете написать что-то сложное, например, как это ...
func simdsum (_ test_array: [UInt32]) -> UInt32 {
var tmpvector=uint4(0)
// assume test_array.count is divisible by four
let limit = test_array.count/4
for i in 0..<limit {
let thisvector = uint4(test_array[4*i],test_array[4*i+1],test_array[4*i+2],test_array[4*i+3])
tmpvector = tmpvector &+ thisvector
}
return tmpvector[0] + tmpvector[1] + tmpvector[2] + tmpvector[3]
}
Однако, давайте посмотрим, что монтаж быстрый производит для первой функции ...
simdsum[0x100001070] <+448>: movdqu 0x20(%rcx,%rdi,4), %xmm2 simdsum[0x100001076] <+454>: movdqu 0x30(%rcx,%rdi,4), %xmm3 (...) simdsum[0x10000107c] <+460>: paddd %xmm2, %xmm0 simdsum[0x100001080] <+464>: paddd %xmm3, %xmm1
Ах! Ах! Свифт достаточно умен, чтобы векторизовать сумму.
Итак, короткий ответ заключается в том, что если вы пытаетесь вручную создать функцию суммы с помощью инструкций SIMD в Swift, вы, вероятно, тратите свое время ... компилятор выполнит эту работу для вас автоматически.
Смотрите дальнейший код в https://github.com/lemire/Code-used-on-Daniel-Lemire-s-blog/tree/master/extra/swift/simdsum
Компилятор также будет векторизовать 'array.reduce (0, &+)'; Я не думаю, что есть действительно много причин даже написать функцию. (Тем не менее, можно обрабатывать выравнивание и кромку лучше, чем компилятор, это будет иметь значительные ускорения, если ваш массив, как правило, мал, ценой написания явного векторного кода. Для типичных длин> 128 или около того разница будет минимальной). –
«Я не думаю, что есть действительно много причин даже писать функции. "-> Точка, но, конечно, это не противоречит тому, что я сказал. –
Как я понимаю из http://stackoverflow.com/questions/5567517/sum-array-of-unsigned-8-bit-integers-using-the-accelerate-framework , такая функция не действует непосредственно на целые массивы. –