- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于已经测量过或对此类注意事项有深入了解的人员,假定您必须执行以下操作(为示例选择任何一个)浮点运算符:
float calc(float y, float z)
{ return sqrt(y * y + z * z) / 100; }
y
和
z
可以是非正规数的情况下,让我们假设两种可能的情况,其中y,z或完全随机的方式可能都是非正规数
float calc(float y, float z)
{
bool yzero = y < 1e-37;
bool zzero = z < 1e-37;
bool all_zero = yzero and zzero;
bool some_zero = yzero != zzero;
if (all_zero)
return 0f;
float ret;
if (!some_zero) ret = sqrt(y * y + z * z);
else if (yzero) ret = z;
else if (zzero) ret = y;
return ret / 100;
}
float x = 0f; // Will x be just 0 or maybe some number like 1e-40;
float y = 0.; // I assume the conversion is just thin-air here and the compiler will see just a 0.
0; // Is "exact zero" a normal or a denormal number?
float z = x / 1; // Will this "no-op" (x == 0) cause z be something like 1e-40 and thus denormal?
float zz = x / c; // What about a "no-op" operating against any compiler-time constant?
bool yzero = y < 1e-37; // Have comparisions any performance penalty when y is denormal or they don't?
最佳答案
许多ISA(包括x86)都免费提供硬件支持,请参阅以下re:FTZ / DAZ。当您使用-ffast-math
或等效版本进行编译时,大多数编译器会在启动期间设置这些标志。
还要注意,在某些情况下,您的代码无法避免惩罚(在硬件上存在惩罚):对于较小但已标准化的y * y
或z * z
, y
或z
可以是次普通的。 (Good catch, @chtz)。 y*y
的指数是y
的指数的两倍,负数或正数。使用23 explicit mantissa bits in a float
时,大约是12个指数值,它们是次正规值的平方根,并且不会一直溢出到0
。
平方次方总是会使0
下溢;我不知道,次乘输入比乘乘的次乘输出更不可能受到惩罚。 是否在一个微体系结构中进行操作,是否具有低于正常的惩罚可能会有所不同,例如加/减vs.乘vs.除法。
另外,任何负y
或z
都将被视为0
,除非您的输入已知为非负数,否则这可能是一个错误。
if results can vary so widely, x86 microarchitectures will be my main use case
fp_assists.any
)0.0
的全零编码是次正态的一种特殊情况)。 因此,您可以使用andps
/ pcmpeqd
/ andps
等整数SIMD操作手动刷新为零AMD Ryzen (from Agner Fog's microarch pdf)
Floating point operations that give a subnormal result take a few clock cycles extra. The same is the case when a multiplication or division underflows to zero. This is far less than the high penalty on the Bulldozer and Piledriver. There is no penalty when flush-to-zero mode and denormals-are-zero mode are both on.
Intel Silvermont (Atom) from Agner Fog's microarch pdf
Operations that have subnormal numbers as input or output or generate underflow take approximately 160 clock cycles unless the flush-to-zero mode and denormals-are-zero mode are both used.
And now assume I want to avoid the performance penalty of dealing with denormal numbers and I just want to treat them as 0
-ffast-math
进行编译将在调用main
之前链接一些用于设置FTZ / DAZ的额外启动代码。 IIRC,在大多数操作系统上,线程从主线程继承MXCSR设置。0
和次规范之间的区别。 float x = 0f; // Will x be just 0 or maybe some number like 1e-40;
0.f
或0.0f
0x00000000
),因此,这绝对是在使用IEEE FP的任何平台上都可以得到的东西。您不会随机获得未编写的次法线。float z = x / 1; // Will this "no-op" (x == 0) cause z be something like 1e-40 and thus denormal?
0.0 / 1.0
提供除0.0
之外的任何内容。sqrt
)的最大允许误差为0.5 ulp,即准确的结果必须正确舍入为最接近的可表示FP值,一直到尾数的最后一位。 bool yzero = y < 1e-37; // Have comparisons any performance penalty when y is denormal or they don't?
1e-37
的类型为double
,并将导致y
升级为double
。您可能希望与1e-37f
相比,这实际上可以避免不正常的处罚。次普通float-> int在Core 2上没有损失,但是不幸的是cvtss2sd
在Core 2上仍然有很大的损失。(GCC/clang don't optimize away即使使用-ffast-math
也可以进行转换,尽管我认为这样做是因为1e-37
可以精确地表示为一个单位,并且每个次正规float可以精确地表示为规范化的double。因此对double的提升始终是精确的,并且不能更改结果)。vcmplt_oqpd
进行比较不会导致任何减慢,也不会与ucomisd
进行整数FLAGS的比较。但是在Core 2上,两者都很慢。0
而不是1
,因此子范式是一种特殊情况。因此,硬件可能会选择不在快速路径上处理该问题,而是采用微码辅助。较旧的x86硬件可能处理得较慢。nextafter
在位模式上只是整数++或-)。但这显然不是硬件的作用。cvt[t]ps2dq
或等效的pd将打包的float / double转换为带有截断或当前舍入模式的int32。因此,根据我的测试,例如this recent proposed LLVM optimization is safe on Skylake and Core 2。0
)不会受到任何惩罚。但这确实对Conroe(P6系列)造成了巨大的损失。关于c++ - 性能损失:数字归一化与分支错误预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60969892/
我是pytorch的新手。请问添加'loss.item()'有什么区别?以下2部分代码: for epoch in range(epochs): trainingloss =0 for
我有一个包含 4 列的 MySQL 表,如下所示。 TransactionID | Item | Amount | Date ------------------------------------
我目前正在使用 cocos2d、Box2D 和 Objective-C 为 iPad 和 iPhone 制作游戏。 每次更新都会发生很多事情,很多事情必须解决。 我最近将我的很多代码重构为几个小方法,
我一直在关注 Mixed Precision Guide .因此,我正在设置: keras.mixed_precision.set_global_policy(mixed_precision) 像这样
double lnumber = Math.pow(2, 1000); 打印 1.0715086071862673E301 我尝试过的事情 我尝试使用 BigDecimal 类来扩展这个数字: St
我正在尝试创建一个神经网络来近似函数(正弦、余弦、自定义...),但我在格式上遇到困难,我不想使用输入标签,而是使用输入输出。我该如何更改它? 我正在关注this tutorial import te
我有一个具有 260,000 行和 35 列的“单热编码”(全一和零)数据矩阵。我正在使用 Keras 训练一个简单的神经网络来预测一个连续变量。制作网络的代码如下: model = Sequenti
什么是像素级 softmax 损失?在我的理解中,这只是一个交叉熵损失,但我没有找到公式。有人能帮我吗?最好有pytorch代码。 最佳答案 您可以阅读 here所有相关内容(那里还有一个指向源代码的
我正在训练一个 CNN 架构来使用 PyTorch 解决回归问题,其中我的输出是一个 20 个值的张量。我计划使用 RMSE 作为模型的损失函数,并尝试使用 PyTorch 的 nn.MSELoss(
在每个时代结束时,我得到例如以下输出: Epoch 1/25 2018-08-06 14:54:12.555511: 2/2 [==============================] - 86
我正在使用 Keras 2.0.2 功能 API (Tensorflow 1.0.1) 来实现一个网络,该网络接受多个输入并产生两个输出 a 和 b。我需要使用 cosine_proximity 损失
我正在尝试设置很少层的神经网络,这将解决简单的回归问题,这应该是f(x) = 0,1x 或 f(x) = 10x 所有代码如下所示(数据生成和神经网络) 4 个带有 ReLu 的全连接层 损失函数 R
我正在研究在 PyTorch 中使用带有梯度惩罚的 Wasserstein GAN,但始终得到大的、正的生成器损失,并且随着时间的推移而增加。 我从 Caogang's implementation
我正在尝试在 TensorFlow 中实现最大利润损失。这个想法是我有一些积极的例子,我对一些消极的例子进行了采样,并想计算类似的东西 其中 B 是我的批处理大小,N 是我要使用的负样本数。 我是 t
我正在尝试预测一个连续值(第一次使用神经网络)。我已经标准化了输入数据。我不明白为什么我会收到 loss: nan从第一个纪元开始的输出。 我阅读并尝试了以前对同一问题的回答中的许多建议,但没有一个对
我目前正在学习神经网络,并尝试训练 MLP 以使用 Python 中的反向传播来学习 XOR。该网络有两个隐藏层(使用 Sigmoid 激活)和一个输出层(也是 Sigmoid)。 网络(大约 20,
尝试在 keras 中自定义损失函数(平滑 L1 损失),如下所示 ValueError: Shape must be rank 0 but is rank 5 for 'cond/Switch' (
我试图在 tensorflow 中为门牌号图像创建一个卷积神经网络 http://ufldl.stanford.edu/housenumbers/ 当我运行我的代码时,我在第一步中得到了 nan 的成
我正在尝试使用我在 Keras 示例( https://github.com/keras-team/keras/blob/master/examples/variational_autoencoder
我试图了解 CTC 损失如何用于语音识别以及如何在 Keras 中实现它。 我认为我理解的内容(如果我错了,请纠正我!)总体而言,CTC 损失被添加到经典网络之上,以便逐个元素(对于文本或语音而言逐个
我是一名优秀的程序员,十分优秀!