SIMD benchmark

F i L witte2008 at gmail.com
Tue Jan 17 17:32:30 PST 2012


Timon Gehr wrote:
> Are they really a general solution? How do you use vector ops 
> to implement an efficient matrix multiply, for instance?

struct Matrix4
{
    float4 x, y, z, w;

    auto transform(Matrix4 mat)
    {
        Matrix4 rmat;

        float4 cx = {mat.x.x, mat.y.x, mat.z.x, mat.w.x};
        float4 cy = {mat.x.y, mat.y.y, mat.z.y, mat.w.y};
        float4 cz = {mat.x.z, mat.y.z, mat.z.z, mat.w.z};
        float4 cw = {mat.x.w, mat.y.w, mat.z.w, mat.w.w};

        float4 rx = {mat.x.x, mat.x.y, mat.x.z, mat.x.w};
        float4 ry = {mat.y.x, mat.y.y, mat.y.z, mat.y.w};
        float4 rz = {mat.z.x, mat.z.y, mat.z.z, mat.z.w};
        float4 rw = {mat.w.x, mat.w.y, mat.w.z, mat.w.w};

        rmat.x = cx * rx; // simd
        rmat.y = cy * ry; // simd
        rmat.z = cz * rz; // simd
        rmat.w = cw * rw; // simd

        return rmat;
    }
}


More information about the Digitalmars-d mailing list