Java 21孵化版Vector API数组对比报错及实现问询
Java 21 Vector API 向量对比结果写入数组的正确实现
问题原因
触发IndexOutOfBoundsException的核心原因是:VectorMask的intoArray方法没有支持mask参数的重载版本,直接调用时会尝试将整个向量长度的布尔值写入目标数组。当循环处理到数组末尾的部分元素(比如示例中数组长度为5,若向量批次长度为4,最后一次循环i=4时仅剩余1个有效元素),写入操作会超出result数组的边界,导致越界异常。
解决方案
方法一:将VectorMask转为布尔向量后写入
利用VectorMask.toVector()方法将掩码转换为BooleanVector,布尔向量的intoArray方法支持传入mask参数,只会写入mask覆盖的有效元素,完美适配末尾的部分批次场景。
修正后的代码:
int[] a1 = new int[] {1, 2, 3, 4, 5}; int[] a2 = new int[] {1, 2, 3, 4, 5}; boolean[] result = new boolean[] {false, false, false, false, false}; var species = IntVector.SPECIES_PREFERRED; for (int i = 0; i < a1.length; i += species.length()) { var mask = species.indexInRange(i, a1.length); var v1 = IntVector.fromArray(species, a1, i, mask); var v2 = IntVector.fromArray(species, a2, i, mask); VectorMask<Integer> eqMask = v1.eq(v2); // 转换为布尔向量,通过带mask的intoArray写入有效元素 eqMask.toVector().intoArray(result, i, mask); }
方法二:手动遍历有效索引写入
如果不需要利用布尔向量的向量化加速,也可以直接遍历mask覆盖的有效索引,逐个写入结果,逻辑更直观:
int[] a1 = new int[] {1, 2, 3, 4, 5}; int[] a2 = new int[] {1, 2, 3, 4, 5}; boolean[] result = new boolean[] {false, false, false, false, false}; var species = IntVector.SPECIES_PREFERRED; int batchSize = species.length(); for (int i = 0; i < a1.length; i += batchSize) { var mask = species.indexInRange(i, a1.length); var v1 = IntVector.fromArray(species, a1, i, mask); var v2 = IntVector.fromArray(species, a2, i, mask); VectorMask<Integer> eqMask = v1.eq(v2); // 仅处理mask覆盖的有效索引,避免越界 for (int j = 0; j < batchSize; j++) { int targetIdx = i + j; if (targetIdx >= a1.length) break; result[targetIdx] = eqMask.laneIsSet(j); } }
说明
- 方法一更贴合Vector API的向量化设计,能充分利用硬件加速优势;
- 方法二更适合需要精细控制写入逻辑的场景,代码可读性更高。
内容的提问来源于stack exchange,提问作者Hollow.Quincy
相关产品推荐
相关产品推荐

