SIMD Support
نوع VecElement{T}
مخصص لبناء مكتبات عمليات SIMD. يتطلب الاستخدام العملي له استخدام llvmcall
. يتم تعريف النوع على النحو التالي:
struct VecElement{T}
value::T
end
لديها قاعدة تجميع خاصة: يتم تعيين مجموعة متجانسة من VecElement{T}
إلى نوع vector
في LLVM عندما يكون T
نوع بت بدائي.
عند -O3
، قد يقوم المترجم تلقائيًا بتوجيه العمليات على مثل هذه المجموعات. على سبيل المثال، البرنامج التالي، عند تجميعه باستخدام julia -O3
، يولد تعليمات جمع SIMD اثنتين (addps
) على أنظمة x86:
const 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
.