simd 相关问题

单指令,多数据(SIMD)是使每个指令在小块或数据元素矢量上操作的概念。 CPU矢量指令集包括:x86 SSE和AVX,ARM NEON和PowerPC AltiVec。为了有效地使用SIMD指令,数据需要采用数组结构形式,并且应该在更长的流中发生。天真的“SIMD优化”代码通常比原始代码运行速度慢。

在循环迭代之间消耗整个缓存线有什么特别的好处吗?

我的程序添加了浮点数组,并在通过 MSVC 和 G++ 进行最大优化编译时展开 4 倍。我不明白为什么两个编译器都选择展开 4x,所以我做了一些测试,发现只有

回答 1 投票 0

在 Rust 中查找 comptime 中的 SIMD 行数

我为点积编写了以下 simd 友好的代码: pub fn scalar_product_simd(a: &[T], b: &[T]) -> T 在哪里 T:乘法 + 求和 + 复制 + 加法 我为点积编写了以下 simd 友好的代码: pub fn scalar_product_simd<T>(a: &[T], b: &[T]) -> T where T: Mul<Output = T> + Sum + Copy + Add<Output = T>, { const CHUNK_SIZE: usize = 4; assert!(a.len() >= CHUNK_SIZE && b.len() >= CHUNK_SIZE && a.len() == b.len()); let mut i = 0; let mut acc = a .chunks_exact(CHUNK_SIZE) .zip(b.chunks_exact(CHUNK_SIZE)) .map(|(aa, bb)| { i += CHUNK_SIZE; aa.iter().zip(bb).map(|(&x, &y)| x * y).sum() }) .sum(); // handle remaining elements acc = acc + scalar_product(&a[i..], &b[i..]); acc } 如何根据编译参数和T类型的大小来设置CHUNK_SIZE值。例如,对于 T:f64 和 AVX2 CHUNK_SIZE 将等于 4 ? 也许有一种正确的方法可以使用 std::simd 重写此代码? 我认为我不完全理解你的问题,但是如果你想根据 CHUNK_SIZE 的类型拥有不同的常量 T 值,并且你想要支持的 T 数量有限,你可以创建一个辅助特征。 trait SimdHelper { const CHUNK_SIZE: usize; } impl SimdHelper for f64 { const CHUNK_SIZE: usize = 4; } pub fn scalar_product_simd<T>(a: &[T], b: &[T]) -> T where T: Mul<Output = T> + Sum + Copy + Add<Output = T>, T: SimdHelper, { const CHUNK_SIZE: usize = <T as SimdHelper>::CHUNK_SIZE; ... }

回答 1 投票 0

Apple 芯片上的 SIMD、并行和 GPU 计算

考虑一个 n x m 浮点数矩阵,比如 A={a_{ij}},其中 n 和 m 非常大。我想计算一个 n x n 对称矩阵,比如 B={b_{ij}},其通用条目 b_{ij}=\sum_{k=1}^{m} a_{ik}*a_{jk}/m,夫...

回答 1 投票 0

如何在clang中链接experimental::simd

我在 MacOS Ventura 上的 clang++ 中链接 std::experimental::simd 操作时遇到问题。这是我最小的失败: #包括 使用 std::experimental::simd; int main(...

回答 1 投票 0

在 SSE2 上进行无符号 64 位比较的最有效方法是什么?

PCMPGTQ 在 SSE2 上不存在,并且本身不适用于无符号整数。我们的目标是为无符号 64 位比较提供向后兼容的解决方案,以便我们可以将它们包含到...

回答 2 投票 0

如何向量化 2 个数组的 DotProduct 计算?

我有以下方法计算给定数组的点积: 静态双 DotProduct(uint[] vecA, uint[] vecB) { 双点积 = 0; 对于 (var i = 0; i < vecA.Len...

回答 1 投票 0

SIMD:逐个字符比较两个字符串并找出匹配的总数

我正在开发一种生物信息学工具。我对应用 SIMD 来提高其速度感兴趣。给定两个长度相等的字符串,我想快速计算这两个字符串的索引总数...

回答 1 投票 0

如何使用 SIMD 优化这个“点积”函数?它是 Mat4x4 * Vec4,但具有巨大的跨步访问

我在尝试为该函数获得最佳加速时遇到了一个大问题,但我无法编写击败自动矢量化器的有效 SIMD 代码。我需要写一些 SIMD 来击败它,但我已经完成了......

回答 1 投票 0

ARM SIMD Aarch64 (NEON) 上的模数

我正在学习 ARM-v8 Aarch64 SIMD 指令,希望可以优化一些计算。在本例中,我正在寻找 4xf32 向量的模运算。 我怎样才能实现模数...

回答 1 投票 0

使用 SIMD 指令快速搜索 uint8_t 向量中的特定位置

我有一个由 uint8_t 符号组成的向量 V,我需要将其划分为一系列不重叠的短语。划分算法很简单:如果 V[i-1]>V[i] 且 V[i]&...

回答 1 投票 0

AVX512 4D 向量收集的最佳指令序列

使用 AVX512 指令,我可以使用索引向量从数组中收集 16 个单精度值。然而,这样的收集操作效率并不高,并且仅以 2 标量的速率发出......

回答 1 投票 0

如何向编译器指示数据已对齐?

考虑到包装了shared_ptr和std::span的代码以实现一些额外的类型安全: 模板 类向量{ 民众: 自动开始() { std::begin(data_); } 自动结束() { std::end(data_)...

回答 1 投票 0

在 __mm128 寄存器中设置最后一个值

所以我有一组具有混合值的数据用于打包目的,如下所示: {(Point_x, Point_y, Point_z, 标量),(Point_x, Point_y, Point_z, 标量),(Point_x, Point_y, Point_z, 标量),...}...

回答 1 投票 0

使用SVE的程序可以自动适应更广泛的SVE寄存器集吗?

如果我编写一个使用SVE指令的程序,并在支持256位宽度SVE寄存器集的ARM平台上编译它。然后将可执行文件复制到支持512位宽度的ARM平台...

回答 1 投票 0

如何在 Zig 中明确使用 SIMD?

阅读 Zig 语言参考后,我发现向量部分指出 @Vector 将在可能的情况下使用 SIMD 指令。后续有一个示例 const a = @Vector(4, i32)...

回答 2 投票 0

如何在一个C++应用程序中支持多个SIMD架构?

我正在用 C++ 编写一个应用程序,我想使用 SIMD 的内在函数。 现在我想为不同的架构(如 SSE、AVX2 和 AVX512)编写单独的代码。 我可以在运行时检查哪个硬件...

回答 1 投票 0

如何最安全地读取数组末尾以启用 simd 矢量化?

我有一个长度正好为 15 的数组。如果它的长度正好为 16,我的函数就会有一个很好的优化 simd 实现。出于性能原因,我想假装它是 len...

回答 1 投票 0

在同一个 SIMD 寄存器中连续添加值

我正在尝试将其转换为 AVX2: // 并行数组 int16_t* 数字 = ... int16_t* 容量 = ... int** 数据 = ... int* 自由指针 = ... 对于 (int i = 0; i < n; i++) { if (Nums[i] == 0)...

回答 1 投票 0

Visual Studio 无法识别 __AVX2__ 或 __AVX__

我正在用 C++ 实现一个简单的 SIMD 包装器。 为了使其跨平台,我使用 CMake 通过 Visual Studio 设置项目 我添加了 /Arch:AVX2,但 Visual Studio 无法识别 __AVX2__ ...

回答 1 投票 0

Avx2 内在函数不使用所有可用的寄存器。 .NET 8

我使用 SIMD 优化了某些算法,使得它们与 L1 缓存相比具有延迟限制。由于只有 C# 编译器知道的原因, said 莫名其妙地发出只使用 ym 的代码...

回答 1 投票 0

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