Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for intrinsics for NTuple{VecElement} #55118

Draft
wants to merge 12 commits into
base: master
Choose a base branch
from

Conversation

oscardssmith
Copy link
Member

This is the start towards proper SIMD support in Base. Currently the main things missing are support for masked/predicated instructions, and an intrinsic to load an arbitrarily chosen sized NTuple{n, VecElement} from a Memory. Many thanks to Alexandre Prieur for pair programming this with me, and @vtjnash, @gbaraldi and @vchuravy for answering the 50 million questions about C++/LLVM/debugging.

julia> f(a,b) = Core.Intrinsics.mul_float(a, b)
julia> a = ntuple(i->VecElement(sqrt(i)), 8);

julia> @code_llvm f(a,a)
; Function Signature: f(NTuple{8, VecElement{Float64}}, NTuple{8, VecElement{Float64}})
;  @ REPL[1]:1 within `f`
define <8 x double> @julia_f_949(<8 x double> %"a::Tuple", <8 x double> %"b::Tuple") #0 {
top:
  %0 = fmul <8 x double> %"a::Tuple", %"b::Tuple"
  ret <8 x double> %0
}

@nsajko nsajko added the compiler:simd instruction-level vectorization label Jul 13, 2024
@oscardssmith oscardssmith force-pushed the os/vectorized-intrinsics branch from 7ee1df5 to 6aced19 Compare July 28, 2024 03:13
src/intrinsics.cpp Outdated Show resolved Hide resolved
@oscardssmith oscardssmith marked this pull request as draft July 28, 2024 12:01
@tecosaur
Copy link
Contributor

tecosaur commented Sep 9, 2024

As one of the people rather excited about this, I'm wondering whether I might hope to see this progress to a non-draft PR in the near future, or whether this has some blocker/major further work needed? 🙂

@oscardssmith
Copy link
Member Author

I'm unlikely to have time to do all the things that likely will be necessary to finish this off. there's no blockers, just a bunch more work.

@vchuravy vchuravy force-pushed the os/vectorized-intrinsics branch from e05da0d to b5117ac Compare October 7, 2024 10:02
export vload, vstore!, natural_vecwidth

# TODO: See C# and Co Vec type
# TODO: Hardware portable vector types...
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would this include vscale? 👀

@vchuravy vchuravy force-pushed the os/vectorized-intrinsics branch from 4977f8c to 71dd9ab Compare November 4, 2024 16:13
import Core.Intrinsics: add_float, sub_float, mul_float, div_float, muladd_float, neg_float

## floating point promotions ##
promote_rule(::Type{Vec{N, Float32}}, ::Type{Vec{N, Float16}}) where N = Vec{N, Float32}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is not obvious to me that these should be defined. When you are doing low level SIMD stuff you probably don't want to accidentally promote things and in case where you really want to work with different types, an explicit convert might be better for clarity?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler:simd instruction-level vectorization
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants