为什么这段代码,
const float x[16] = { 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8,
1.9, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6};
const float z[16] = {1.123, 1.234, 1.345, 156.467, 1.578, 1.689, 1.790, 1.812,
1.923, 2.034, 2.145, 2.256, 2.367, 2.478, 2.589, 2.690};
float y[16];
for (int i = 0; i < 16; i++)
{
y[i] = x[i];
}
for (int j = 0; j < 9000000; j++)
{
for (int i = 0; i < 16; i++)
{
y[i] *= …Run Code Online (Sandbox Code Playgroud) c++ floating-point performance compilation visual-studio-2010
在长时间搜索性能错误后,我读到了非正规浮点值.
显然,非规范化的浮点值可能是主要的性能问题,如此问题所示: 为什么将0.1f更改为0会使性能降低10倍?
我有一个Intel Core 2 Duo,我正在使用gcc进行编译-O2.
那我该怎么办?我可以以某种方式指示g ++避免非正规值吗?如果没有,我可以以某种方式测试一个float是否是非正规的?
问: DBL_MIN是最小的正双倍?
下面的代码似乎没有提出这个问题.但如果这是真的,那么如何定义DBL_MIN以及它的用途或目的是什么.
平台:Windows7和Visual Studio 2013
double next_to_zero = std::nextafter(0.0,DBL_MIN);
bool b = DBL_MIN <= next_to_zero;
std::cout << std::boolalpha
<< "is dbl_min the smallest representable double? "
<< b << '\n';
std::cout << std::setprecision(56)
<< "dbl_min = " << DBL_MIN << '\n'
<< "next to zero = " << next_to_zero;
Run Code Online (Sandbox Code Playgroud)
输出:
dbl_min是最小的可表示的双倍?假
dbl_min = 2.2250738585072013830902327173324040642192159804623318306e-308
零旁边= 4.9406564584124654417656879286822137236505980261432476443e-324
我已经编写了一些矢量方法,这些方法可以进行简单的数学就地计算或复制,并且对于就地变体共享相同的惩罚.
最简单的可以归结为这样的东西:
void scale(float* dst, const float* src, int count, float factor)
{
__m128 factorV = _mm_set1_ps(factorV);
for(int i = 0; i < count; i+= 4)
{
__m128 in = _mm_load_ps(src);
in = _mm_mul_ps(in, factorV);
_mm_store_ps(dst, in);
dst += 4;
src += 4;
}
}
Run Code Online (Sandbox Code Playgroud)
测试代码:
for(int i = 0; i < 1000000; i++)
{
scale(alignedMemPtrDst, alignedMemPtrSrc, 256, randomFloatAbsRange1);
}
Run Code Online (Sandbox Code Playgroud)
在测试时,即在SAME缓冲区上重复操作此函数时,我发现如果dst和src相同,速度是相同的.如果它们不同,它的速度要快70倍.写作时主要循环(即_mm_store_ps)
有趣的是,相同的行为不适用于添加,即+ =很好地工作,只有*=是一个问题..
-
评论已经回答了这个问题.在人工测试期间它是非正规的.