Java中的SIMD向量/矩阵?

Java中的SIMD向量/矩阵?,java,graphics,3d,jvm,simd,Java,Graphics,3d,Jvm,Simd,我正在用Java编写一个图形库,主要用于游戏开发。它需要用于3D计算的基本矢量和矩阵对象,理想情况下,这些对象将采用SIMD操作。虽然Java不直接提供这样的操作,但是可以提示JVM在大型数组的上下文中使用它们。因此 JVM可以对类似向量的对象进行向量化操作吗?如果是这样,我如何确保这种情况发生? 澄清一下:我需要对小的、静态大小的对象进行操作,而不是可变长度数组。例如,严格为3x3或4x4的矩阵,严格长度为4的向量,等等。大型可变长度数组的矢量化 矢量化的一些候选示例: public clas

我正在用Java编写一个图形库,主要用于游戏开发。它需要用于3D计算的基本矢量和矩阵对象,理想情况下,这些对象将采用SIMD操作。虽然Java不直接提供这样的操作,但是可以提示JVM在大型数组的上下文中使用它们。因此

JVM可以对类似向量的对象进行向量化操作吗?如果是这样,我如何确保这种情况发生?

澄清一下:我需要对小的、静态大小的对象进行操作,而不是可变长度数组。例如,严格为3x3或4x4的矩阵,严格长度为4的向量,等等。大型可变长度数组的矢量化

矢量化的一些候选示例:

public class Vector4f
{
    public int x, y, z, w;

    public void madd(Vector4f multiplicand, Vector4f addend)
    {
        this.x = this.x * multiplicand.x + addend.x;
        this.y = this.y * multiplicand.y + addend.y;
        this.z = this.z * multiplicand.z + addend.z;
        this.w = this.w * multiplicand.w + addend.w;
    }

    public float dot(Vector4f other)
    {
        return this.x * other.x
             + this.y * other.y
             + this.z * other.z
             + this.w * other.w;
    }
}

public class Matrix44f
{
    public float m00, m01, m02, m03;
    public float m10, m11, m12, m13;
    public float m20, m21, m22, m23;
    public float m30, m31, m32, m33;

    public void multiply(Matrix44f other) { ... }
    public void transform(Vector4f other) { ... }
    public void andSoOnAndSoForth() { ... }
}

如果需要性能保证,您可以随时求助于JNI。与其考虑java是否会使用一些低级优化技术,不如进行基准测试,看看它是否符合您的性能要求。在本机代码中实现SIMD似乎并不太困难。另外,请注意,为了实现依赖SIMD的成功广泛部署,您需要所有JVM/JIT都具有SIMD功能,我对此深表怀疑。通常,在3D游戏开发中,向量和矩阵在性能敏感的代码中非常丰富。这不是特定需求的问题,而是库所使用的任何应用程序的一般性能。另外,我的理解是,在像这样的小型原子操作中,单个JNI调用的开销将超过好处。但是,当您发现java是否支持SIMD优化后,会发生什么情况呢?这会对你的发展道路产生影响吗?对于JNI,我建议只替换那些必须一次性处理成批数据的部分(因为SIMD在这方面有优势)。小的原子操作可以留在java字节码中。如果您的操作过于分散,无法进行批处理,那么您可能会考虑用本机代码重写大部分引擎,或者将其吸收,并希望JVM能够完成它的任务。好吧,这当然不仅仅是好奇,因为我正在编写库,以便在我打算发布的实际游戏中使用,并且希望接下来会有更多的游戏。不,它不会从根本上改变我的开发路径,但它会影响我正在开发/研究的引擎的性能(因此,是的,实际上,我认为存在一个可测量的用例)。批处理当然是一种可能性(例如,每个游戏实体的轮换是从本地池分配的3x3矩阵),虽然你只能真正批量处理整体性的事情,比如加速,而不需要付出巨大的努力。但是,如果SSE操作需要批量数据才能很好地执行,那么你肯定有道理。(我不知道是否是这种情况。我假设神话般的4倍加速只取决于数据的可用性,以便无中断地插入寄存器。)