-
Notifications
You must be signed in to change notification settings - Fork 4.9k
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
[API Proposal]: Expose AVX512 FP16
and AVX
F16C
ISA
#98820
Comments
Tagging subscribers to this area: @dotnet/area-system-runtime-intrinsics Issue DetailsBackground and motivationThis proposal allows to accelerate We use API Proposalclass F16c : Avx2
{
// vcvtph2ps
public static Vector128<float> ConvertToSingle(Vector128<Half> value);
public static Vector258<float> ConvertToSingle(Vector258<Half> value);
// vcvtps2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<float> value, byte control);
public static Vector258<Half> ConvertToVector256Half(Vector258<float> value, byte control);
}
class Avx512Fp16 : Avx512F
{
// vaddph
public static Vector512<Half> Add(Vector512<Half> left, Vector512<Half> right);
// vdivph
public static Vector512<Half> Divide(Vector512<Half> left, Vector512<Half> right);
// vgetexpph
public static Vector512<Half> GetExponent(Vector512<Half> value);
// vgetmantph
public static Vector512<Half> GetMantissa(Vector512<Half> value, byte control);
// vmaxph
public static Vector512<Half> Max(Vector512<Half> left, Vector512<Half> right);
// vminph
public static Vector512<Half> Min(Vector512<Half> value, Vector512<Half> right);
// vminph
public static Vector512<Half> Multiply(Vector512<Half> left, Vector512<Half> right);
// vrcpph
public static Vector512<Half> Reciprocal(Vector512<Half> value);
// vreduceph
public static Half Reduce(Vector512<Half> left, byte control);
// vrndscaleph
public static Vector512<Half> RoundScale(Vector512<Half> left, byte control);
// vrsqrtph
public static Vector512<Half> ReciprocalSqrt(Vector512<Half> value);
// vscalefph
public static Vector512<Half> FloatingPointScale(Vector512<Half> left, Vector512<Half> right, byte control);
// vsqrtph
public static Vector512<Half> Sqrt(Vector512<Half> value);
// vsubph
public static Vector512<Half> Subtract(Vector512<Half> left, Vector512<Half> right);
// vfmaddpch
public static Vector512<Half> FusedComplexMultiplyAdd(Vector512<Half> left, Vector512<Half> right);
// vfcmaddpch
public static Vector512<Half> FusedComplexMultiplyAddConjugate(Vector512<Half> left, Vector512<Half> right);
// vfmulpch
public static Vector512<Half> ComplexMultiply(Vector512<Half> left, Vector512<Half> right);
// vfcmulpch
public static V0ector512<Half> ComplexMultiplyConjugate(Vector512<Half> left, Vector512<Half> right);
// vfmaddsubXXXph
public static Vector512<Half> FusedMultiplyAddSubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vfmsubaddXXXph
public static Vector512<Half> FusedMultiplySubtractAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vfmaddXXXph
public static Vector512<Half> FusedMultiplyAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vfmsubXXXph
public static Vector512<Half> FusedMultiplySubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vfnmaddXXXph
public static Vector512<Half> FusedMultiplyAddNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vfnmsubXXXph
public static Vector512<Half> FusedMultiplySubtractNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
// vcmpph
public static Vector512<Half> Compare(Vector512<Half> left, Vector512<Half> right, FloatComparisonMode mode);
public static Vector512<Half> CompareGreaterThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareGreaterThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareLessThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareLessThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotGreaterThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotGreaterThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotLessThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotLessThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareOrdered(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareUnordered(Vector512<Half> left, Vector512<Half> right);
// vfpclassph
public static Vector512<Half> CheckFloatingPointClass(Vector512<Half> value, byte control);
// vcvtw2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<short> value);
// vcvtdq2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<int> value);
// vcvtqq2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<long> value);
// vcvtuw2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<ushort> value);
// vcvtudq2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<uint> value);
// vcvtuqq2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<ulong> value);
// vcvtps2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<float> value);
// vcvtpd2ph
public static Vector512<Half> ConvertToVector512Half(Vector512<double> value);
// vcvtph2w
public static Vector512<short> ConvertToVector512Int16(Vector512<Half> value);
// vcvtph2dq
public static Vector512<int> ConvertToVector512Int32(Vector512<Half> value);
// vcvtph2qq
public static Vector512<long> ConvertToVector512Int64(Vector512<Half> value);
// vcvtph2uw
public static Vector512<ushort> ConvertToVector512UInt16(Vector512<Half> value);
// vcvtph2udq
public static Vector512<uint> ConvertToVector512UInt32(Vector512<Half> value);
// vcvtph2uqq
public static Vector512<ulong> ConvertToVector512UInt64(Vector512<Half> value);
// vcvtph2ps
public static Vector512<float> ConvertToVector512Single(Vector512<Half> value);
// vcvtph2pd
public static Vector512<double> ConvertToVector512Double(Vector512<Half> value);
// SCALAR Ops
// vaddsh
public static Vector128<Half> AddScalar(Vector128<Half> left, Vector128<Half> right);
// vdivsh
public static Vector128<Half> DivideScalar(Vector128<Half> left, Vector128<Half> right);
// vgetexpss
public static Vector128<Half> GetExponentScalar(Vector128<Half> value);
// vgetmantsh
public static Vector128<Half> GetMantissaScalar(Vector128<Half> value, byte control);
// vmaxpsh
public static Vector128<Half> MaxScalar(Vector128<Half> left, Vector128<Half> right);
// vminsh
public static Vector128<Half> MinScalar(Vector128<Half> value, Vector128<Half> right);
// vmulsh
public static Vector128<Half> MultiplyScalar(Vector128<Half> left, Vector128<Half> right);
// vrcpsh
public static Vector128<Half> ReciprocalScalar(Vector128<Half> value);
// vreducesh
public static Half ReduceScalar(Vector128<Half> left, byte control);
// vrndscalesh
public static Vector128<Half> RoundScaleScalar(Vector128<Half> left, byte control);
// vrsqrtsh
public static Vector128<Half> ReciprocalSqrtScalar(Vector128<Half> value);
// vscalefsh
public static Vector128<Half> FloatingPointScaleScalar(Vector128<Half> left, Vector128<Half> right, byte control);
// vsqrtsh
public static Vector128<Half> SqrtScalar(Vector128<Half> value);
// vsubsh
public static Vector128<Half> SubtractScalar(Vector128<Half> left, Vector128<Half> right);
// vfmaddcsh
public static Vector128<Half> FusedComplexMultiplyAddScalar(Vector128<Half> left, Vector128<Half> right);
// vfcmaddcsh
public static Vector128<Half> FusedComplexMultiplyAddConjugateScalar(Vector128<Half> left, Vector128<Half> right);
// vfmulcsh
public static Vector128<Half> ComplexMultiplyScalar(Vector128<Half> left, Vector128<Half> right);
// vfcmulcsh
public static Vector128<Half> ComplexMultiplyConjugateScalar(Vector128<Half> left, Vector128<Half> right);
// vfmaddsubXXXsh
public static Vector128<Half> FusedMultiplyAddSubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmsubaddXXXsh
public static Vector128<Half> FusedMultiplySubtractAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmaddXXXsh
public static Vector128<Half> FusedMultiplyAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmsubXXXsh
public static Vector128<Half> FusedMultiplySubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfnmaddXXXsh
public static Vector128<Half> FusedMultiplyAddNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfnmsubXXXsh
public static Vector128<Half> FusedMultiplySubtractNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> CompareScalar(Vector128<Half> left, Vector128<Half> right, FloatComparisonMode mode);
public static Vector128<Half> CompareGreaterThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareOrderedScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareUnorderedScalar(Vector128<Half> left, Vector128<Half> right);
// vfpclasssh
public static Vector128<Half> CheckFloatingPointClassScalar(Vector128<Half> value, byte control);
// vcvtsi2ss
public static Vector128<Half> ConvertToHalfScalar(int value);
public static Vector128<Half> ConvertToHalfScalar(long value);
// vcvtusi2sh
public static Vector128<Half> ConvertToHalfScalar(uint value);
public static Vector128<Half> ConvertToHalfScalar(ulong value);
// vcvtss2sh
public static Vector128<Half> ConvertToHalfScalar(Vector128<float> value);
// vcvtsd2sh
public static Vector128<Half> ConvertToHalfScalar(Vector128<double> value);
// vcvtsh2si
public static int ConvertToInt32Scalar(Vector128<Half> value);
public static long ConvertToInt64Scalar(Vector128<Half> value);
// vcvtsh2usi
public static uint ConvertToUInt32Scalar(Vector128<Half> value);
public static ulong ConvertToUInt64Scalar(Vector128<Half> value);
// vcvtsh2ss
public static Vector128<float> ConvertToFloatScalar(Vector128<Half> value);
// vcvtsh2sd
public static Vector128<double> ConvertToDoubleScalar(Vector128<Half> value);
class VL : Avx512F.VL
{
// vaddph
public static Vector128<Half> Add(Vector128<Half> left, Vector128<Half> right);
// vdivph
public static Vector128<Half> Divide(Vector128<Half> left, Vector128<Half> right);
// vgetexpph
public static Vector128<Half> GetExponent(Vector128<Half> value);
// vgetmantph
public static Vector128<Half> GetMantissa(Vector128<Half> value, byte control);
// vmaxph
public static Vector128<Half> Max(Vector128<Half> left, Vector128<Half> right);
// vminph
public static Vector128<Half> Min(Vector128<Half> value, Vector128<Half> right);
// vminph
public static Vector128<Half> Multiply(Vector128<Half> left, Vector128<Half> right);
// vrcpph
public static Vector128<Half> Reciprocal(Vector128<Half> value);
// vreduceph
public static Half Reduce(Vector128<Half> left, byte control);
// vrndscaleph
public static Vector128<Half> RoundScale(Vector128<Half> left, byte control);
// vrsqrtph
public static Vector128<Half> ReciprocalSqrt(Vector128<Half> value);
// vscalefph
public static Vector128<Half> FloatingPointScale(Vector128<Half> left, Vector128<Half> right, byte control);
// vsqrtph
public static Vector128<Half> Sqrt(Vector128<Half> value);
// vsubph
public static Vector128<Half> Subtract(Vector128<Half> left, Vector128<Half> right);
// vfcmaddpch
public static Vector128<Half> FusedComplexMultiplyAdd(Vector128<Half> left, Vector128<Half> right);
// vfcmaddpch
public static Vector128<Half> FusedComplexMultiplyAddConjugate(Vector128<Half> left, Vector128<Half> right);
// vfmulpch
public static Vector128<Half> ComplexMultiply(Vector128<Half> left, Vector128<Half> right);
// vfcmulpch
public static Vector128<Half> ComplexMultiplyConjugate(Vector128<Half> left, Vector128<Half> right);
// vfmaddsubXXXph
public static Vector128<Half> FusedMultiplyAddSubtract(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmsubaddXXXph
public static Vector128<Half> FusedMultiplySubtractAdd(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmaddXXXph
public static Vector128<Half> FusedMultiplyAdd(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfmsubXXXph
public static Vector128<Half> FusedMultiplySubtract(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfnmaddXXXph
public static Vector128<Half> FusedMultiplyAddNegated(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vfnmsubXXXph
public static Vector128<Half> FusedMultiplySubtractNegated(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
// vcmpph
public static Vector128<Half> Compare(Vector128<Half> left, Vector128<Half> right, FloatComparisonMode mode);
public static Vector128<Half> CompareGreaterThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareOrdered(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareUnordered(Vector128<Half> left, Vector128<Half> right);
// vfpclassph
public static Vector128<Half> CheckFloatingPointClass(Vector128<Half> value, byte control);
// vcvtw2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<short> value);
// vcvtdq2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<int> value);
// vcvtqq2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<long> value);
// vcvtuw2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<ushort> value);
// vcvtudq2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<uint> value);
// vcvtuqq2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<ulong> value);
// vcvtps2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<float> value);
// vcvtpd2ph
public static Vector128<Half> ConvertToVector128Half(Vector128<double> value);
// vcvtph2w
public static Vector128<short> ConvertToVector128Int16(Vector128<Half> value);
// vcvtph2dq
public static Vector128<int> ConvertToVector128Int32(Vector128<Half> value);
// vcvtph2qq
public static Vector128<long> ConvertToVector128Int64(Vector128<Half> value);
// vcvtph2uw
public static Vector128<ushort> ConvertToVector128UInt16(Vector128<Half> value);
// vcvtph2udq
public static Vector128<uint> ConvertToVector128UInt32(Vector128<Half> value);
// vcvtph2uqq
public static Vector128<ulong> ConvertToVector128UInt64(Vector128<Half> value);
// vcvtph2ps
public static Vector128<float> ConvertToVector128Single(Vector128<Half> value);
// vcvtph2pd
public static Vector128<double> ConvertToVector128Double(Vector128<Half> value);
// 256
// vaddph
public static Vector256<Half> Add(Vector256<Half> left, Vector256<Half> right);
// vdivph
public static Vector256<Half> Divide(Vector256<Half> left, Vector256<Half> right);
// vgetexpph
public static Vector256<Half> GetExponent(Vector256<Half> value);
// vgetmantph
public static Vector256<Half> GetMantissa(Vector256<Half> value, byte control);
// vmaxph
public static Vector256<Half> Max(Vector256<Half> left, Vector256<Half> right);
// vminph
public static Vector256<Half> Min(Vector256<Half> value, Vector256<Half> right);
// vminph
public static Vector256<Half> Multiply(Vector256<Half> left, Vector256<Half> right);
// vrcpph
public static Vector256<Half> Reciprocal(Vector256<Half> value);
// vreduceph
public static Half Reduce(Vector256<Half> left, byte control);
// vrndscaleph
public static Vector256<Half> RoundScale(Vector256<Half> left, byte control);
// vrsqrtph
public static Vector256<Half> ReciprocalSqrt(Vector256<Half> value);
// vscalefph
public static Vector256<Half> FloatingPointScale(Vector256<Half> left, Vector256<Half> right, byte control);
// vsqrtph
public static Vector256<Half> Sqrt(Vector256<Half> value);
// vsubph
public static Vector256<Half> Subtract(Vector256<Half> left, Vector256<Half> right);
// vfmaddpch
public static Vector256<Half> FusedComplexMultiplyAdd(Vector256<Half> left, Vector256<Half> right);
// vfcaddlpch
public static Vector256<Half> FusedComplexMultiplyAddConjugate(Vector256<Half> left, Vector256<Half> right);
// vfmulpch
public static Vector256<Half> ComplexMultiply(Vector256<Half> left, Vector256<Half> right);
// vfcmulpch
public static Vector256<Half> ComplexMultiplyConjugate(Vector256<Half> left, Vector256<Half> right);
// vfmaddsubXXXph
public static Vector256<Half> FusedMultiplyAddSubtract(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vfmsubaddXXXph
public static Vector256<Half> FusedMultiplySubtractAdd(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vfmaddXXXph
public static Vector256<Half> FusedMultiplyAdd(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vfmsubXXXph
public static Vector256<Half> FusedMultiplySubtract(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vfnmaddXXXph
public static Vector256<Half> FusedMultiplyAddNegated(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vfnmsubXXXph
public static Vector256<Half> FusedMultiplySubtractNegated(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
// vcmpph
public static Vector256<Half> Compare(Vector256<Half> left, Vector256<Half> right, FloatComparisonMode mode);
public static Vector256<Half> CompareGreaterThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareGreaterThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareLessThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareLessThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotGreaterThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotGreaterThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotLessThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotLessThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareOrdered(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareUnordered(Vector256<Half> left, Vector256<Half> right);
// vfpclassph
public static Vector258<Half> CheckFloatingPointClass(Vector258<Half> value, byte control);
// vcvtw2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<short> value);
// vcvtdq2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<int> value);
// vcvtqq2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<long> value);
// vcvtuw2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<ushort> value);
// vcvtudq2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<uint> value);
// vcvtuqq2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<ulong> value);
// vcvtps2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<float> value);
// vcvtpd2ph
public static Vector256<Half> ConvertToVector256Half(Vector256<double> value);
// vcvtph2w
public static Vector256<short> ConvertToVector256Int16(Vector256<Half> value);
// vcvtph2dq
public static Vector256<int> ConvertToVector256Int32(Vector256<Half> value);
// vcvtph2qq
public static Vector256<long> ConvertToVector256Int64(Vector256<Half> value);
// vcvtph2uw
public static Vector256<ushort> ConvertToVector256UInt16(Vector256<Half> value);
// vcvtph2udq
public static Vector256<uint> ConvertToVector256UInt32(Vector256<Half> value);
// vcvtph2uqq
public static Vector256<ulong> ConvertToVector256UInt64(Vector256<Half> value);
// vcvtph2ps
public static Vector256<float> ConvertToVector256Single(Vector256<Half> value);
// vcvtph2pd
public static Vector256<double> ConvertToVector256Double(Vector256<Half> value);
}
} API UsageN/A Alternative DesignsN/A RisksN/A
|
@dotnet/avx512-contrib |
Duplicate of #62416? |
There is overlap, but having it explicitly separated is a bit better for API review, especially since we've got 3 separate total concerns to consider: |
-- Fixed a couple typos of @anthonycanino, It looks like we can't directly use |
Since this is a |
A fixup would be still needed due to the special handling of bit 2. |
Why not just let a user cast custom constants with it set to get the officially unsupported |
Because then that doesn't actually work with We should either expose this like we do for other rounding APIs:
or we should expose it as is and expect users to know the control bits off the top of their head:
|
@anthonycanino, Looks like we might also be missing a couple APIs:
And there are a couple APIs that need name fixups:
I've adjusted the top post to include these changes |
I think then there might be a few convenience overloads missing which I haven't added and we should minimally discuss. Most notably there are some concepts like These APIs are notably bitwise or represent a general-purpose operation and historically have existed as explicit overloads for both floating-point and integer overloads. Since they exist for Historically there have been explicit floating-point vs integer variants (like However, there isn't an explicit |
FYI, My thoughts on this are, it's confusing to have multiple rounding mode setups. I think making this consistent with other APIs is the most consistent. Won't |
I am fine with this. Given that all AVX512 extensions are packed up with AVX512 FP16 (and naturally on AVX10 onwards) we can safely rely on them to optimize/implement these methods. |
Yes, same for a few of the other APIs. |
Ok, I'll make those adjustments. So we agree on the use of |
namespace System.Runtime.Intrinsics.X86;
public sealed class F16c : Avx2
{
public static bool IsSupported { get; }
public static Vector128<float> ConvertToVector128Single(Vector128<Half> value);
public static Vector256<float> ConvertToVector256Single(Vector128<Half> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<float> value, byte control);
public static Vector128<Half> ConvertToVector128Half(Vector256<float> value, byte control);
}
public sealed class Avx512Fp16 : Avx512F
{
public static bool IsSupported { get; }
public static Vector512<Half> Add(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Add(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> Divide(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Divide(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> GetExponent(Vector512<Half> value);
public static Vector512<Half> GetMantissa(Vector512<Half> value, byte control);
public static Vector512<Half> Max(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Min(Vector512<Half> value, Vector512<Half> right);
public static Vector512<Half> Multiply(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Multiply(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> Reciprocal(Vector512<Half> value);
public static Half Reduce(Vector512<Half> left, byte control);
public static Vector512<Half> RoundScale(Vector512<Half> left, byte control);
public static Vector512<Half> ReciprocalSqrt(Vector512<Half> value);
public static Vector512<Half> ReciprocalSqrt(Vector512<Half> value, FloatRoundingMode mode);
public static Vector512<Half> Scale(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Scale(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> Sqrt(Vector512<Half> value);
public static Vector512<Half> Sqrt(Vector512<Half> value, FloatRoundingMode mode);
public static Vector512<Half> Subtract(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Subtract(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> FusedComplexMultiplyAdd(Vector512<Half> addend, Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> FusedComplexMultiplyAddConjugate(Vector512<Half> addend, Vector512<Half> left, Vector512<Half> rightConjugate);
public static Vector512<Half> FusedComplexMultiplyAddConjugate(Vector512<Half> addend, Vector512<Half> left, Vector512<Half> rightConjugate, FloatRoundingMode mode);
public static Vector512<Half> ComplexMultiply(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> ComplexMultiply(Vector512<Half> left, Vector512<Half> right, FloatRoundingMode mode);
public static Vector512<Half> ComplexMultiplyConjugate(Vector512<Half> left, Vector512<Half> rightConjugate);
public static Vector512<Half> ComplexMultiplyConjugate(Vector512<Half> left, Vector512<Half> rightConjugate, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplyAddSubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplyAddSubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplySubtractAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplySubtractAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplyAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplyAdd(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplySubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplySubtract(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplyAddNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplyAddNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> FusedMultiplySubtractNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c);
public static Vector512<Half> FusedMultiplySubtractNegated(Vector512<Half> a, Vector512<Half> b, Vector512<Half> c, FloatRoundingMode mode);
public static Vector512<Half> Compare(Vector512<Half> left, Vector512<Half> right, FloatComparisonMode mode);
public static Vector512<Half> CompareEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareGreaterThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareGreaterThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareLessThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareLessThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotGreaterThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotGreaterThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotLessThan(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareNotLessThanOrEqual(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareOrdered(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> CompareUnordered(Vector512<Half> left, Vector512<Half> right);
public static Vector512<Half> Classify(Vector512<Half> value, byte control);
public static Vector512<Half> ConvertToVector512Half(Vector512<short> value);
public static Vector512<Half> ConvertToVector512Half(Vector512<short> value, FloatRoundingMode mode);
public static Vector256<Half> ConvertToVector256Half(Vector512<int> value);
public static Vector256<Half> ConvertToVector256Half(Vector512<int> value, FloatRoundingMode mode);
public static Vector128<Half> ConvertToVector128Half(Vector512<long> value);
public static Vector128<Half> ConvertToVector128Half(Vector512<long> value, FloatRoundingMode mode);
public static Vector512<Half> ConvertToVector512Half(Vector512<ushort> value);
public static Vector512<Half> ConvertToVector512Half(Vector512<ushort> value, FloatRoundingMode mode);
public static Vector256<Half> ConvertToVector256Half(Vector512<uint> value);
public static Vector256<Half> ConvertToVector256Half(Vector512<uint> value, FloatRoundingMode mode);
public static Vector128<Half> ConvertToVector128Half(Vector512<ulong> value);
public static Vector128<Half> ConvertToVector128Half(Vector512<ulong> value, FloatRoundingMode mode);
public static Vector256<Half> ConvertToVector256Half(Vector512<float> value);
public static Vector256<Half> ConvertToVector256Half(Vector512<float> value, FloatRoundingMode mode);
public static Vector128<Half> ConvertToVector128Half(Vector512<double> value);
public static Vector128<Half> ConvertToVector128Half(Vector512<double> value, FloatRoundingMode mode);
public static Vector512<short> ConvertToVector512Int16(Vector512<Half> value);
public static Vector512<short> ConvertToVector512Int16(Vector512<Half> value, FloatRoundingMode mode);
public static Vector512<short> ConvertToVector512Int16WithTruncation(Vector512<Half> value);
public static Vector512<int> ConvertToVector512Int32(Vector256<Half> value);
public static Vector512<int> ConvertToVector512Int32(Vector256<Half> value, FloatRoundingMode mode);
public static Vector512<int> ConvertToVector512Int32WithTruncation(Vector256<Half> value);
public static Vector512<long> ConvertToVector512Int64(Vector128<Half> value);
public static Vector512<long> ConvertToVector512Int64(Vector128<Half> value, FloatRoundingMode mode);
public static Vector512<long> ConvertToVector512Int64WithTruncation(Vector128<Half> value);
public static Vector512<ushort> ConvertToVector512UInt16(Vector512<Half> value);
public static Vector512<ushort> ConvertToVector512UInt16(Vector512<Half> value, FloatRoundingMode mode);
public static Vector512<ushort> ConvertToVector512UInt16WithTruncation(Vector512<Half> value);
public static Vector512<uint> ConvertToVector512UInt32(Vector256<Half> value);
public static Vector512<uint> ConvertToVector512UInt32(Vector256<Half> value, FloatRoundingMode mode);
public static Vector512<uint> ConvertToVector512UInt32WithTruncation(Vector256<Half> value);
public static Vector512<ulong> ConvertToVector512UInt64(Vector128<Half> value);
public static Vector512<ulong> ConvertToVector512UInt64(Vector128<Half> value, FloatRoundingMode mode);
public static Vector512<ulong> ConvertToVector512UInt64WithTruncation(Vector128<Half> value);
public static Vector512<float> ConvertToVector512Single(Vector256<Half> value);
public static Vector512<double> ConvertToVector512Double(Vector128<Half> value);
public static Vector512<double> ConvertToVector512Double(Vector128<Half> value, FloatRoundingMode mode);
public static Vector128<Half> AddScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> AddScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> DivideScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> DivideScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> GetExponentScalar(Vector128<Half> value);
public static Vector128<Half> GetMantissaScalar(Vector128<Half> value, byte control);
public static Vector128<Half> MaxScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> MinScalar(Vector128<Half> value, Vector128<Half> right);
public static Vector128<Half> MultiplyScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> MultiplyScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> ReciprocalScalar(Vector128<Half> value);
public static Half ReduceScalar(Vector128<Half> left, byte control);
public static Vector128<Half> RoundScaleScalar(Vector128<Half> left, byte control);
public static Vector128<Half> ReciprocalSqrtScalar(Vector128<Half> value);
public static Vector128<Half> ScaleScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> ScaleScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> SqrtScalar(Vector128<Half> value);
public static Vector128<Half> SqrtScalar(Vector128<Half> value, FloatRoundingMode mode);
public static Vector128<Half> SubtractScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> SubtractScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> FusedComplexMultiplyAddScalar(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> FusedComplexMultiplyAddScalar(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> FusedComplexMultiplyAddConjugateScalar(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> rightConjugate);
public static Vector128<Half> FusedComplexMultiplyAddConjugateScalar(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> rightConjugate, FloatRoundingMode mode);
public static Vector128<Half> ComplexMultiplyScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> ComplexMultiplyScalar(Vector128<Half> left, Vector128<Half> right, FloatRoundingMode mode);
public static Vector128<Half> ComplexMultiplyConjugateScalar(Vector128<Half> left, Vector128<Half> rightConjugate);
public static Vector128<Half> ComplexMultiplyConjugateScalar(Vector128<Half> left, Vector128<Half> rightConjugate, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplyAddSubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplyAddSubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplySubtractAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtractAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplyAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplyAddScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplySubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtractScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplyAddNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplyAddNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> FusedMultiplySubtractNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtractNegatedScalar(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c, FloatRoundingMode mode);
public static Vector128<Half> CompareScalar(Vector128<Half> left, Vector128<Half> right, FloatComparisonMode mode);
public static Vector128<Half> CompareEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanOrEqualScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareOrderedScalar(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareUnorderedScalar(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedEqual(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedGreaterThan(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedGreaterThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedLessThan(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedLessThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarOrderedNotEqual(Vector128<Half> left, Vector128<Half> right);
public static bool CompareScalarUnorderedEqual(Vector128<float> left, Vector128<float> right);
public static bool CompareScalarUnorderedGreaterThan(Vector128<float> left, Vector128<float> right);
public static bool CompareScalarUnorderedGreaterThanOrEqual(Vector128<float> left, Vector128<float> right);
public static bool CompareScalarUnorderedLessThan(Vector128<float> left, Vector128<float> right);
public static bool CompareScalarUnorderedLessThanOrEqual(Vector128<float> left, Vector128<float> right);
public static bool CompareScalarUnorderedNotEqual(Vector128<float> left, Vector128<float> right);
public static Vector128<Half> ClassifyScalar(Vector128<Half> value, byte control);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, int value);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, int value, FloatRoundingMode mode);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, uint value);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, uint value, FloatRoundingMode mode);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, Vector128<float> value);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, Vector128<float> value, FloatRoundingMode mode);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, Vector128<double> value);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, Vector128<double> value, FloatRoundingMode mode);
public static int ConvertToInt32(Vector128<Half> value);
public static int ConvertToInt32(Vector128<Half> value, FloatRoundingMode mode);
public static int ConvertToInt32WithTruncation(Vector128<Half> value);
public static uint ConvertToUInt32(Vector128<Half> value);
public static uint ConvertToUInt32(Vector128<Half> value, FloatRoundingMode mode);
public static uint ConvertToUInt32WithTruncation(Vector128<Half> value);
public static Vector128<float> ConvertScalarToVector128Single(Vector128<float> upper, Vector128<Half> value);
public static Vector128<float> ConvertScalarToVector128Single(Vector128<float> upper, Vector128<Half> value, FloatRoundingMode mode);
public static Vector128<double> ConvertScalarToVector128Double(Vector128<double> upper, Vector128<Half> value);
public static Vector128<double> ConvertScalarToVector128Double(Vector128<double> upper, Vector128<Half> value, FloatRoundingMode mode);
public sealed class X64 : Avx512F.X64
{
public static bool IsSupported { get; }
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, long value);
public static Vector128<Half> ConvertScalarToVector128Half(Vector128<Half> upper, ulong value);
public static long ConvertToInt64(Vector128<Half> value);
public static long ConvertToInt64WithTruncation(Vector128<Half> value);
public static ulong ConvertToUInt64(Vector128<Half> value);
public static ulong ConvertToUInt64WithTruncation(Vector128<Half> value);
}
public sealed class VL : Avx512F.VL
{
public static bool IsSupported { get; }
public static Vector128<Half> Add(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> Divide(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> GetExponent(Vector128<Half> value);
public static Vector128<Half> GetMantissa(Vector128<Half> value, byte control);
public static Vector128<Half> Max(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> Min(Vector128<Half> value, Vector128<Half> right);
public static Vector128<Half> Multiply(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> Reciprocal(Vector128<Half> value);
public static Half Reduce(Vector128<Half> left, byte control);
public static Vector128<Half> RoundScale(Vector128<Half> left, byte control);
public static Vector128<Half> ReciprocalSqrt(Vector128<Half> value);
public static Vector128<Half> Scale(Vector128<Half> left, Vector128<Half> right, byte control);
public static Vector128<Half> Sqrt(Vector128<Half> value);
public static Vector128<Half> Subtract(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> FusedComplexMultiplyAdd(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> FusedComplexMultiplyAddConjugate(Vector128<Half> addend, Vector128<Half> left, Vector128<Half> rightConjugate);
public static Vector128<Half> ComplexMultiply(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> ComplexMultiplyConjugate(Vector128<Half> left, Vector128<Half> rightConjugate);
public static Vector128<Half> FusedMultiplyAddSubtract(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtractAdd(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplyAdd(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtract(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplyAddNegated(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> FusedMultiplySubtractNegated(Vector128<Half> a, Vector128<Half> b, Vector128<Half> c);
public static Vector128<Half> Compare(Vector128<Half> left, Vector128<Half> right, FloatComparisonMode mode);
public static Vector128<Half> CompareEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareGreaterThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareLessThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotGreaterThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThan(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareNotLessThanOrEqual(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareOrdered(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> CompareUnordered(Vector128<Half> left, Vector128<Half> right);
public static Vector128<Half> Classify(Vector128<Half> value, byte control);
public static Vector128<Half> ConvertToVector128Half(Vector128<short> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<int> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<long> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<ushort> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<uint> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<ulong> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<float> value);
public static Vector128<Half> ConvertToVector128Half(Vector128<double> value);
public static Vector128<short> ConvertToVector128Int16(Vector128<Half> value);
public static Vector128<short> ConvertToVector128Int16WithTruncation(Vector128<Half> value);
public static Vector128<int> ConvertToVector128Int32(Vector128<Half> value);
public static Vector128<int> ConvertToVector128Int32WithTruncation(Vector128<Half> value);
public static Vector128<long> ConvertToVector128Int64(Vector128<Half> value);
public static Vector128<long> ConvertToVector128Int64WithTruncation(Vector128<Half> value);
public static Vector128<ushort> ConvertToVector128UInt16(Vector128<Half> value);
public static Vector128<ushort> ConvertToVector128UInt16WithTruncation(Vector128<Half> value);
public static Vector128<uint> ConvertToVector128UInt32(Vector128<Half> value);
public static Vector128<uint> ConvertToVector128UInt32WithTruncation(Vector128<Half> value);
public static Vector128<ulong> ConvertToVector128UInt64(Vector128<Half> value);
public static Vector128<ulong> ConvertToVector128UInt64WithTruncation(Vector128<Half> value);
public static Vector128<float> ConvertToVector128Single(Vector128<Half> value);
public static Vector128<double> ConvertToVector128Double(Vector128<Half> value);
public static Vector256<Half> Add(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> Divide(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> GetExponent(Vector256<Half> value);
public static Vector256<Half> GetMantissa(Vector256<Half> value, byte control);
public static Vector256<Half> Max(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> Min(Vector256<Half> value, Vector256<Half> right);
public static Vector256<Half> Multiply(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> Reciprocal(Vector256<Half> value);
public static Half Reduce(Vector256<Half> left, byte control);
public static Vector256<Half> RoundScale(Vector256<Half> left, byte control);
public static Vector256<Half> ReciprocalSqrt(Vector256<Half> value);
public static Vector256<Half> Scale(Vector256<Half> left, Vector256<Half> right, byte control);
public static Vector256<Half> Sqrt(Vector256<Half> value);
public static Vector256<Half> Subtract(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> FusedComplexMultiplyAdd(Vector256<Half> addend, Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> FusedComplexMultiplyAddConjugate(Vector256<Half> addend, Vector256<Half> left, Vector256<Half> rightConjugate);
public static Vector256<Half> ComplexMultiply(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> ComplexMultiplyConjugate(Vector256<Half> left, Vector256<Half> rightConjugate);
public static Vector256<Half> FusedMultiplyAddSubtract(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> FusedMultiplySubtractAdd(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> FusedMultiplyAdd(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> FusedMultiplySubtract(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> FusedMultiplyAddNegated(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> FusedMultiplySubtractNegated(Vector256<Half> a, Vector256<Half> b, Vector256<Half> c);
public static Vector256<Half> Compare(Vector256<Half> left, Vector256<Half> right, FloatComparisonMode mode);
public static Vector256<Half> CompareEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareGreaterThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareGreaterThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareLessThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareLessThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotGreaterThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotGreaterThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotLessThan(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareNotLessThanOrEqual(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareOrdered(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> CompareUnordered(Vector256<Half> left, Vector256<Half> right);
public static Vector256<Half> Classify(Vector256<Half> value, byte control);
public static Vector256<Half> ConvertToVector256Half(Vector256<short> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<int> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<long> value);
public static Vector256<Half> ConvertToVector256Half(Vector256<ushort> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<uint> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<ulong> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<float> value);
public static Vector128<Half> ConvertToVector128Half(Vector256<double> value);
public static Vector256<short> ConvertToVector256Int16(Vector256<Half> value);
public static Vector256<short> ConvertToVector256Int16WithTruncation(Vector256<Half> value);
public static Vector256<int> ConvertToVector256Int32(Vector128<Half> value);
public static Vector256<int> ConvertToVector256Int32WithTruncation(Vector128<Half> value);
public static Vector256<long> ConvertToVector256Int64(Vector128<Half> value);
public static Vector256<long> ConvertToVector256Int64WithTruncation(Vector128<Half> value);
public static Vector256<ushort> ConvertToVector256UInt16(Vector256<Half> value);
public static Vector256<ushort> ConvertToVector256UInt16WithTruncation(Vector256<Half> value);
public static Vector256<uint> ConvertToVector256UInt32(Vector128<Half> value);
public static Vector256<uint> ConvertToVector256UInt32WithTruncation(Vector128<Half> value);
public static Vector256<ulong> ConvertToVector256UInt64(Vector128<Half> value);
public static Vector256<ulong> ConvertToVector256UInt64WithTruncation(Vector128<Half> value);
public static Vector256<float> ConvertToVector256Single(Vector128<Half> value);
public static Vector256<double> ConvertToVector256Double(Vector128<Half> value);
}
} |
This will be quite useful for me! :) Fast conversion between |
Background and motivation
This proposal allows to accelerate
FP16
operations through Intel'sFP16
ISAs. BothF16c
andAVX512 FP16
are covered.We use
System.Half
datatype --- the managed implementation ofFP16
in .NET --- as the foundational datatype for theFP16
operations. Note that this proposal exposes the API for latter implementation, but it will require some .NET internal rework, particularly around the use ofSystem.Half
as a hardware accelerated vectorized data type.API Proposal
API Usage
N/A
Alternative Designs
N/A
Risks
N/A
The text was updated successfully, but these errors were encountered: