You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 19:16:07