2016-12-21 9 views
1

Есть ли встроенное средство для ускорения или в другом месте для суммирования массива UInt32 с использованием ускоренных векторных операций?Swift SIMD или Accelerate Sum UInt32

+0

Как я понимаю из http://stackoverflow.com/questions/5567517/sum-array-of-unsigned-8-bit-integers-using-the-accelerate-framework , такая функция не действует непосредственно на целые массивы. –

ответ

4

Я полагаю, что вы хотите, чтобы ускорить функции, такие как

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

+0

Компилятор также будет векторизовать 'array.reduce (0, &+)'; Я не думаю, что есть действительно много причин даже написать функцию. (Тем не менее, можно обрабатывать выравнивание и кромку лучше, чем компилятор, это будет иметь значительные ускорения, если ваш массив, как правило, мал, ценой написания явного векторного кода. Для типичных длин> 128 или около того разница будет минимальной). –

+1

«Я не думаю, что есть действительно много причин даже писать функции. "-> Точка, но, конечно, это не противоречит тому, что я сказал. –