2、Java 向量计算:实现与优化

Java 向量计算:实现与优化

1. 引言

在编程领域,向量计算能力能显著提升程序性能。然而,传统的向量计算方法,如插入内联汇编、调用向量内在函数、使用向量 API 编写程序等,对 Java 程序员并不适用。为了将向量计算能力引入 Java 世界,我们开发了两种互补的方法:基于库的编程方法和基于编译的自动方法。

2. 相关工作
  • Jikes RVM 中的 SLP 自动向量化器 :使用修改后的树模式匹配算法识别相似连续指令并转换为等效向量指令,依赖循环展开进行不同迭代的计算向量化。但处于初始阶段,不生成真正的单指令多数据(SIMD)指令,而是用 32 位整数指令模拟 16 位短整型和 8 位字节类型的简单向量计算。
  • GCC 编译器的自动向量化 :支持简单的基于循环的自动向量化和循环中的交错内存访问。不过,当前 GCC 向量化器的内存访问步长必须是 2 的幂次方常量。我们的自动向量化算法无此限制,会展开无法向量化的循环部分,若展开指令访问连续地址,互补的 SLP 向量化器可进一步将其分组为向量指令。后来 GCC 向量化器的重要改进是将 SLP 向量化集成到之前的基于循环的向量化器中,形成循环感知的 SLP 向量化器,能更灵活处理各种内存访问模式。
  • Intel C++ 编译器(ICC) :提供四级向量化支持,包括内联汇编、内在函数、C++ 向量库和自动向量化。C++ 向量库提供带有重载运算符的向量类,操作由编译器前端转换为向量中间表示(IR)。我们的 Java 向量类库功能类似,但因 Java 不支持运算符重载
/* * 基于数组的向量实现 */ 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、付费专栏及课程。

余额充值