- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一些 16 字节对齐的结构,它只是包装了 3xFloat32 数组:
#[repr(C, align(16))]
pub struct Vector(pub [f32; 3]);
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);
}
最佳答案
通常没有人会揭露 FP 异常,否则您需要改组以例如复制其中一个元素,以便顶部元素与其他元素之一进行相同的划分。或者有一些其他已知的安全的东西。
如果您可以假设该元素中的被除数是非 NaN,那么您可能只需改组除数即可。
使用 AVX512,您可以使用零掩码抑制元素的异常,但在此之前没有这样的功能。此外,AVX512 允许您在不屏蔽的情况下覆盖舍入模式 + 抑制所有异常 (SAE),因此您可以使最接近偶数显式获得 SAE。但这会抑制所有元素的异常。
说真的,不要启用 FP 异常。如果异常数量是可见的副作用,编译器几乎/不知道如何以安全的方式进行优化。例如GCC -ftrapping-math
默认情况下是打开的,但它坏了。
我不会认为 LLVM 会更好。默认的严格 FP 可能仍然会进行优化,可以在源会引发 2 或 4 的情况下给出一个 SIGFPE。甚至可能会在源会引发 1 的情况下引发 0 的优化,反之亦然,例如 GCC 的损坏和几乎无用的默认值。
但是,如果您希望永远不会出现任何某种异常,那么启用 FP 异常可能对调试很有用。但是您可以通过忽略具有该源地址的指令来处理来自 SIMD 指令的偶然误报。
如果在性能和异常正确性之间进行权衡,那么库的大多数用户宁愿它最大化性能。
甚至使用 fenv
清除并检查粘性 FP 屏蔽标志东西很少做,需要受控的环境才能使用。我不会对库函数调用有任何期望,尤其是不会使用任何 SIMD。
避免垃圾元素中的次正规
如果 MXCSR 没有设置 FTZ 和 DAZ,您可以从次规范(又名非规范)中获得减速。 (即正常情况,除非您使用(Rust 等价物) -ffast-math
编译。)
生成 NaN 或 +-Inf 不需要额外的时间 适用于具有 SSE/AVX 指令的典型 x86 硬件。 (有趣的事实:NaN 也很慢,即使在现代硬件上也有 x87 数学的遗留问题)。所以_mm_or_ps
是安全的与 cmpps
例如,在数学运算之前在向量的某些元素中创建 NAN。或 _mm_and_ps
在除法之前在除数中创建一些零。
但是要注意填充中的垃圾是什么,因为它可能导致虚假的次正规。 0.0
和 NaN(所有的)通常总是安全的。
通常避免使用 SIMD 进行横向填充。 SIMD vec != 几何 vec。
仅使用 SIMD 向量的 4 个元素中的 3 个通常是个坏主意 因为这通常意味着您使用单个 SIMD 向量来保存单个几何向量,而不是三个向量 4 x
坐标,4 y
坐标和 4 z
坐标。
Shuffles/horizontal 大部分都需要额外的指令(除了已经在内存中的标量的广播负载),但如果你以这种方式使用 SIMD,你通常需要大量的 shuffles。在某些情况下,您无法对一系列事物进行矢量化,但您仍然可以通过 SIMD 获得加速。
如果您只是将这个部分向量的东西用于奇数大小操作的剩余元素,那么很棒 ,一个部分向量比 3 个标量迭代要好得多。但是大多数人询问只使用 4 个向量元素中的 3 个是因为他们使用 SIMD 错误,例如添加几何向量作为 SIMD 向量仍然很便宜,但点积需要洗牌。见 https://deplinenoise.wordpress.com/2015/03/06/slides-simd-at-insomniac-games-gdc-2015/一些关于如何以正确的方式使用 SIMD 的好东西(SoA vs. AoS 等等)。如果您已经知道这一点并且只是将 3 元素向量用于奇怪的角落情况,而不是大多数工作,那么那很好。
填充到向量宽度的倍数通常适用于奇数大小,但某些算法的另一种选择是在数据末尾结束的最终未对齐向量。部分重叠的存储很好,除非它是就地算法并且您不必担心不会两次执行元素。 (或者甚至对于像 AND 屏蔽或钳位这样的幂等操作的存储转发停顿)。
免费获得零
如果您只有 2 个 float
剩下的元素,一个 movsd
load 将加载 + 零扩展到 XMM 寄存器。你最好让编译器来代替 movaps
.
否则,如果将 3 个标量混在一起,insertps
可以为零元素。或者您可能已经从 movss
知道 xmm regs 的零高部分从内存中加载。所以使用 0.0
作为向量自标量初始值设定项(如 C++ _mm_set_ps()
)的一部分,编译器可以免费使用。
使用 AVX ,如果您担心填充会导致低于正常值,则可以考虑使用屏蔽负载。 https://www.felixcloutier.com/x86/vmaskmov .但这比 vmovaps
慢一些.在 AMD 甚至 Ryzen 上,蒙面商店的价格要贵得多。
关于rust - "Safe"奇数大小对齐向量的 SIMD 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281270/
我的任务是编写一个java程序,首先询问用户将输入多少个数字,然后输出输入的奇数和偶数个数。它限制为整数 0-100。我的问题是:我的代码中缺少什么? import java.util.Scanner
我正在寻找有关 VBA 脚本的帮助。我一直在试图弄清楚如何使用 mod 功能。 这是我到目前为止所做的: Function AddOddNumbersWithMod(nr) Dim i, su
我只是想从 .NET 调用 kernel32 中的 GetPrivateProfileString 和 GetPrivateProfileSection,但遇到了一些我不明白的奇怪问题。 让我们从这个
我需要做的是在列表中交替应用 2 个函数。例如: (*2) (-3) [4,5,6,7,8] 会导致[8,2,12,4,16] , 因为 4*2 , 5-3 , 6*2 , 7-3 , 8*2 ...
我尝试在 JavaScript 中创建一个函数来判断一个数字是否为偶数,或者它是否是一个数字。我收到此错误: 这是 CodeCademy 中的类(class)。 最佳答案 您正在检查函数 isNaN
当我运行此命令时,不会打印任何内容,我尝试根据用户输入的内容打印一条消息,显示奇数或偶数。 import java.util.Scanner; public class Questions {
我必须编写一个程序来读取 3 个数字(使用输入框),并根据它们的值写入以下消息之一: 所有 3 个数字都是奇数或 所有 3 个数字都是偶数或 2 个数字是奇数,1 个数字是偶数或 1 个数字是奇数
我正在构建一个谷歌图像搜索的示例。我有一个图像网格(搜索结果)。当单击其中一张图像时,我正在使用 jquery 创建的部分标记中加载 html 文档。奇怪的是,如果你查看开发人员工具,html 已加载
我试图仅在偶数行上打印单词 * Even * ,而不包括第一行和第二行(最终不包括最后两行),但它打印 15 行,然后在整个过程中随机打印 * Even * 。使用 6 表示宽度,使用 15 表示高度
我有一个数学函数,它取决于由 给出的三个变量 {n、a 和 b} {a = n+1, b=n} 当 n 为偶数时 {b = n+1, a=n} 当 n 为奇数时 我的函数被调用了很多 次,n 各不相同
我有一个查询,其中有一个条件来检查房间号是否为奇数/偶数。问题在于房间号与建筑物信息一起存储在字符串中。 以下是数据库中数据的格式: ABC-0101A (Odd) ABC-0112B (Even
已关闭。这个问题是 not reproducible or was caused by typos 。目前不接受答案。 这个问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-top
我有一个包含类似内容的页面。 ################################# # __________________________ # # | |
这个问题在这里已经有了答案: Can I combine :nth-child() or :nth-of-type() with an arbitrary selector? (9 个回答) Ho
我正在尝试了解这个素数分解的特定解决方案(取自 http://rosettacode.org/wiki/Prime_decomposition#Python:_Using_floating_point
我知道这可能是一个愚蠢而简单的问题,但我对编程还很陌生。我有以下关于我在一个程序中看到的 if 运算符的问题。这是代码: d= -12.4; if(d) printf("%d \n", abs
我正在尝试制作一个脚本,根据天气情况输出用户名,他们被分配奇数或偶数值。我想我已经设法让奇数的工作,但偶数的不会输出。这是它的样子。 'commentid' 是确定将它们分配给奇数还是偶数的值。 ";
我的 NPE 的 Stacktrace 开始于: Caused by: java.lang.NullPointerException at pl.yourvision.crm.web.serv
我正在尝试查找给定数字(用户输入)是偶数还是奇数。 I'm simply applying AND operation on binary digits of a no. with 1, If the
有谁知道用于可变范围的桶的哈希函数(对于字符串,如果它重要的话),它总是奇数(或质数,如果需要的话)? 本质上,我正在寻找一个散列函数,它将在 n 个桶上提供均匀分布,其中 n 是奇数(或质数,因为
我是一名优秀的程序员,十分优秀!