Spec-Zone.ru › Julia 0.5

Поддержка SIMD

Тип VecElement{T} предназначен для построения библиотек операций SIMD. Практическое использование требует применения llvmcall. Тип определён как:

immutable VecElement{T}
    value::T
end

У него есть специальное правило компиляции: однородная кортеж из VecElement{T} отображается на тип LLVM vector когда T — битовый тип и длина кортежа принадлежит множеству {2-6,8-10,16}.

В -O3, компилятор может автоматически векторизовать операции над такими кортежами. Например, следующая программа, при компиляции с julia -O3 генерирует две инструкции SIMD сложения (addps) на системах x86:

typealias m128 NTuple{4,VecElement{Float32}}

function add(a::m128, b::m128)
    (VecElement(a[1].value+b[1].value),
     VecElement(a[2].value+b[2].value),
     VecElement(a[3].value+b[3].value),
     VecElement(a[4].value+b[4].value))
end

triple(c::m128) = add(add(c,c),c)

code_native(triple,(m128,))

Однако, так как автоматическая векторизация не может быть гарантирована, дальнейшее использование в основном будет через библиотеки, использующие llvmcall.

© 2009–2016 Jeff Bezanson, Stefan Karpinski, Viral B. Shah, and other contributors
Licensed under the MIT License.
https://docs.julialang.org/en/release-0.5/stdlib/simd-types/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API