相关疑难解决方法(0)

为什么将0.1f改为0会使性能降低10倍?

为什么这段代码,

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

1491
推荐指数
5
解决办法
14万
查看次数

避免在C++中使用非正规值

在长时间搜索性能错误后,我读到了非正规浮点值.

显然,非规范化的浮点值可能是主要的性能问题,如此问题所示: 为什么将0.1f更改为0会使性能降低10倍?

我有一个Intel Core 2 Duo,我正在使用gcc进行编译-O2.

那我该怎么办?我可以以某种方式指示g ++避免非正规值吗?如果没有,我可以以某种方式测试一个float是否是非正规的?

c++ floating-point performance

24
推荐指数
4
解决办法
2万
查看次数

DBL_MIN是最小的正双倍?

问: 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

c++ numeric language-lawyer

7
推荐指数
2
解决办法
5078
查看次数

INTEL SIMD:为什么现场乘法这么慢?

我已经编写了一些矢量方法,这些方法可以进行简单的数学就地计算或复制,并且对于就地变体共享相同的惩罚.

最简单的可以归结为这样的东西:

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)

有趣的是,相同的行为不适用于添加,即+ =很好地工作,只有*=是一个问题..

-

评论已经回答了这个问题.在人工测试期间它是非正规的.

c++ sse simd multiplication in-place

3
推荐指数
1
解决办法
172
查看次数