GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing dlang.org — Vector Extensions - D Programming Language Language Reference
Report a bug
If you spot a problem with this page, click here to create a GitHub issue.
Improve this page
Quickly fork, edit online, and submit a pull request for this page.
Requires a signed-in GitHub account. This works well for small changes.
If you'd like to make larger changes you may want to consider using
a local clone.
Vector Extensions Contents
CPUs often support specialized vector types and vector operations (a.k.a. media instructions). Vector types are a fixed array of floating or integer types, and vector operations operate simultaneously on them. Specialized Vector types provide access to them. The VectorBaseType must be a Static Array. The VectorElementType is the unqualified element type of the static array. The dimension of the static array is the number of elements in the vector. Implementation Defined: Which vector types are supported depends
on the target. The implementation is expected to only support
the vector types and operations that are implemented in the target's hardware.
Rationale: Emulating unsupported vector types and operations can exhibit
such poor performance that the user is likely better off selecting a different
algorithm than relying on emulation.
core.simdVector types and operations are introduced by importing core.simd: import core.simd;
Implementation Defined: These types and operations will be the ones defined for the architecture
the compiler is targeting. If a particular CPU family has varying
support for vector types, an additional runtime check may be necessary.
The compiler does not emit runtime checks; those must be done by the
programmer.
Implementation Defined: Depending on the target architecture, compiler flags
may be required to
activate support for SIMD types.
The types defined will all follow the naming convention: typeNNwhere type is the vector element type and NN is the number of those elements in the vector type. The type names will not be keywords. PropertiesVector types have the property:
Vectors support the following properties based on the vector element type. The value produced is that of a vector of the same type with each element set to the value corresponding to the property value for the element type.
ConversionsVector types of the same size (number_of_elements * size_of_element) can be implicitly converted among each other, this is done as a reinterpret cast (a type paint). Vector types can be cast to their VectorBaseType. Integers and floating point values can be implicitly converted to their vector equivalents: int4 v = 7;
v = 3 + v; // add 3 to each element in v
Accessing Individual Vector ElementsThey cannot be accessed directly, but can be when converted to an array type: int4 v; (cast(int*)&v)[3] = 2; // set 3rd element of the 4 int vector (cast(int[4])v)[3] = 2; // set 3rd element of the 4 int vector v.array[3] = 2; // set 3rd element of the 4 int vector v.ptr[3] = 2; // set 3rd element of the 4 int vector Conditional CompilationIf vector extensions are implemented, the version identifier D_SIMD is set. Whether a type exists or not can be tested at compile time with an IsExpression: static if (is(typeNN)) ... yes, it is supported ... else ... nope, use workaround ... Whether a particular operation on a type is supported can be tested at compile time with: float4 a,b; static if (__traits(compiles, a+b)) ... yes, add is supported for float4 ... else ... nope, use workaround ... For runtime testing to see if certain vector instructions are available, see the functions in core.cpuid. A typical workaround for unsupported vector operations would be to use array operations instead: float4 a,b; static if (__traits(compiles, a/b)) c = a / b; else c[] = a[] / b[]; X86 And X86_64 Vector Extension ImplementationImplementation Defined:
The following describes the specific implementation of the vector types for the X86 and X86_64 architectures. The vector extensions are currently implemented for the OS X 32 bit target, and all 64 bit targets. core.simd defines the following types:
Note: for 32 bit gcc and clang, it's long long instead of long.
Operators not listed are not supported at all. Vector Operation IntrinsicsSee core.simd for the supported intrinsics. Copyright © 1999-2026 by the D Language Foundation | Page generated by
Ddoc on Mon Nov 9 05:59:20 2026
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |