反转 FloatVector(1/每个元素)

问题描述 投票:0回答:1

在java中有一个API叫做VectorApi。它使得在单个 CPU 周期内对整个 float[] 数组进行算术运算成为可能。

例如:

FloatVector fv = FloatVector.fromArray(SPECIES, new float[]{1, 2, 3, 4, 5, 6, 7}, 0);
//multiplies the wohle array in a single cycle by 2 (if the CPU supports this)
fv.mul(2f);

现在我想计算 1f / FloatVector 的结果。现在我这样做

fv.pow(-1f);

我认为这可能是一个缓慢的操作。有更好的方法吗?

java simd
1个回答
0
投票

我让这段代码在 Intel 架构 Windows 笔记本电脑上运行(jshell,所以没有类)

import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;

VectorSpecies SPECIES = FloatVector.SPECIES_256;
FloatVector ONE = FloatVector.zero(SPECIES).add(1f);
FloatVector fv = FloatVector.fromArray(SPECIES, new float[]{1, 2, 3, 4, 5, 6, 7, 8}, 0);

fv.pow(-1f);

ONE.div(fv); // gives the same result as the above pow operation

我没有进行任何性能测量,因为它们可能也依赖于平台,但由于您可以将

ONE
定义为常量,并且不必将构造和添加视为耗时的操作,因此您可以自己进行操作以找出答案如果
ONE.div(fv)
的表现优于
fv.pow(-1f);

© www.soinside.com 2019 - 2024. All rights reserved.