C++ 中类成员的 RVV 类型

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

我想在我的 C++ 应用程序中使用 RISC-V 矢量扩展。 我注意到不可能对类成员使用 RVV 类型(例如“vuint32m1_t”)。使用 gcc (v13.2.0) 编译,出现以下错误:

error: member variables cannot have RVV type 'vuint32m1_t'

我在网上找不到参考资料。

我认为解决方案可能是对类成员使用标准类型(例如 uint32_t),并在需要执行向量运算时将它们转换为 RVV 类型。我相信这个解决方案可能会降低性能。

还有其他想法吗?

c++ gcc vectorization riscv
1个回答
0
投票

RVV 向量寄存器与向量长度无关,并且您在编译时不知道向量长度。您不能将 RVV 向量类型直接放入类中,因为需要在编译时知道类和结构的大小。

通常您不需要在类中存储向量,而是存储数据并在需要时从中加载。否则,您可以通过在运行时查询向量长度来为向量分配足够的空间。如果您需要大量加载存储,这两种方法都会有问题,因为 gcc 和 clang 还无法进行谓词向量加载存储消除。

如果您的目标是特定的向量长度,并且仅针对该特定的向量长度,那么您可以使用 riscv_rvv_vector_bits 属性,该属性可以放置在结构和类内部。

您真的需要将向量直接放入您的问题的类中吗? 通常可以更改 API,从而不再需要它,例如

forEach
回调函数而不是迭代器 API,但有时您无法更改 API。

我正在尝试收集您真正需要此功能的案例,因为有一个解决方案可以让您达到 95%,但实施起来并不容易。 编译可以提供固定大小为 512 位的类型,并以这样的方式生成代码:当向量长度较小时,您只需访问较低位,而当向量长度较大时,您不会使用额外的位。你的向量的位。这为您提供了完全与向量长度无关的代码,可从 VLEN=128 扩展到 VLEN=512。它也可以在 VLEN>512 上运行,尽管没有充分利用您的硬件。

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