java中向量化_java – 任何JVM的JIT编译器生成使用向量化浮点指令的代码?

所以,基本上,你希望你的代码运行更快。 JNI是答案。我知道你说这不适合你,但让我告诉你,你错了。

这里是Dot.java:

import java.nio.FloatBuffer;

import org.bytedeco.javacpp.*;

import org.bytedeco.javacpp.annotation.*;

@Platform(include="Dot.h", compiler="fastfpu")

public class Dot {

static { Loader.load(); }

static float[] a = new float[50], b = new float[50];

static float dot() {

float sum = 0;

for (int i = 0; i < 50; i++) {

sum += a[i]*b[i];

}

return sum;

}

static native @MemberGetter FloatPointer ac();

static native @MemberGetter FloatPointer bc();

static native float dotc();

public static void main(String[] args) {

FloatBuffer ab = ac().capacity(50).asBuffer();

FloatBuffer bb = bc().capacity(50).asBuffer();

for (int i = 0; i < 10000000; i++) {

a[i%50] = b[i%50] = dot();

float sum = dotc();

ab.put(i%50, sum);

bb.put(i%50, sum);

}

long t1 = System.nanoTime();

for (int i = 0; i < 10000000; i++) {

a[i%50] = b[i%50] = dot();

}

long t2 = System.nanoTime();

for (int i = 0; i < 10000000; i++) {

float sum = dotc();

ab.put(i%50, sum);

bb.put(i%50, sum);

}

long t3 = System.nanoTime();

System.out.println("dot(): " + (t2 - t1)/10000000 + " ns");

System.out.println("dotc(): " + (t3 - t2)/10000000 + " ns");

}

}

和Dot.h:

float ac[50], bc[50];

inline float dotc() {

float sum = 0;

for (int i = 0; i < 50; i++) {

sum += ac[i]*bc[i];

}

return sum;

}

我们可以编译和运行与JavaCPP使用命令行这些:

$ javac -cp javacpp.jar Dot.java

$ java -jar javacpp.jar Dot

$ java -cp javacpp.jar:. Dot

使用英特尔酷睿i7-3632QM CPU @ 2.20GHz,Fedora 20,GCC 4.8.3和OpenJDK 7或8,我得到这样的输出:

dot(): 37 ns

dotc(): 23 ns

或大约1.6倍快。我们需要使用直接的NIO缓冲区而不是数组,但是使用HotSpot can access direct NIO buffers as fast as arrays.另一方面,在这种情况下,手动展开循环不会提供可衡量的性能提升。

/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值