小编L11*_*117的帖子

Boost 是否提供了 C++14 的 span 实现?

std::span是在 C++20 中引入的,但我仅限于 C++14,并且在较小程度上仅限于任何版本的 Boost 库。Boost中有类似的东西吗?

c++ boost c++14

13
推荐指数
2
解决办法
3956
查看次数

在奇数大小的对齐向量上使用“安全” SIMD算法?

假设我有一些16字节对齐的结构,只包装3xFloat32数组:

#[repr(C, align(16))]
pub struct Vector(pub [f32; 3]);
Run Code Online (Sandbox Code Playgroud)

现在,我想将其划分为两个实例,如下所示:

use core::arch::x86_64;

let a = Vector([1f32, 2f32, 3f32]);
let b = Vector([4f32, 5f32, 6f32]);
let mut q = Vector([0f32, 0f32, 0ff32]);

unsafe {
    let a1 = x86_64::_mm_load_ps(a.0.as_ptr());
    let b1 = x86_64::_mm_load_ps(b.0.as_ptr());
    let q1 = x86_64::_mm_div_ps(a1, b1);
    x86_64::_mm_store_ps(q.0.as_mut_ptr(), q1);
}
Run Code Online (Sandbox Code Playgroud)

它可以进行除法,但是有一个问题:第4个元素包含垃圾,除其他外,垃圾可以发出NaN信号。并且,如果未屏蔽某些例外标志,则将触发SIGFPE。我想以某种方式避免这种情况,而不会完全沉默信号。即我要么只想在第4对元素上使其静音,要么在其中添加一些合理的值。最好,最快的方法是什么?也许总体上有更好的方法?

floating-point sse simd floating-point-exceptions rust

7
推荐指数
1
解决办法
135
查看次数

将 &i64 转换为 &[u8; 的惯用方法是什么?8]?

我正在用blake2板条箱做一些散列。它只接受字节片&[u8]。大部分数据(字符串)可以毫无问题地转换为字节片,但时间戳(i64)不能。是否有跨平台、惯用的方式来进行这种转换?i64 的字节顺序是通过to_le在对其进行任何操作之前调用来确保的。

slice rust

2
推荐指数
1
解决办法
196
查看次数