相关疑难解决方法(0)

编译32位和64位时,性能差异很大(快26倍)

我试图衡量在访问值类型和引用类型列表时使用a for和a 的区别foreach.

我使用以下类进行分析.

public static class Benchmarker
{
    public static void Profile(string description, int iterations, Action func)
    {
        Console.Write(description);

        // Warm up
        func();

        Stopwatch watch = new Stopwatch();

        // Clean up
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();

        watch.Start();
        for (int i = 0; i < iterations; i++)
        {
            func();
        }
        watch.Stop();

        Console.WriteLine(" average time: {0} ms", watch.Elapsed.TotalMilliseconds / iterations);
    }
}
Run Code Online (Sandbox Code Playgroud)

我用double我的价值类型.我创建了这个'假类'来测试引用类型:

class DoubleWrapper
{
    public double Value { get; set; }

    public DoubleWrapper(double value)
    {
        Value …
Run Code Online (Sandbox Code Playgroud)

c# performance 32bit-64bit

78
推荐指数
2
解决办法
6303
查看次数

浮点除法与浮点乘法

通过编码是否有任何(非微优化)性能增益

float f1 = 200f / 2
Run Code Online (Sandbox Code Playgroud)

在比较中

float f2 = 200f * 0.5
Run Code Online (Sandbox Code Playgroud)

几年前我的一位教授告诉我,浮点除法比浮点乘法慢,但没有详细说明原因.

这句话适用于现代PC架构吗?

UPDATE1

关于评论,请同时考虑这个案例:

float f1;
float f2 = 2
float f3 = 3;
for( i =0 ; i < 1e8; i++)
{
  f1 = (i * f2 + i / f3) * 0.5; //or divide by 2.0f, respectively
}
Run Code Online (Sandbox Code Playgroud)

更新2 从评论中引用:

[我想]知道什么是算法/架构要求导致>除法在硬件上比复制要复杂得多

c++ floating-point micro-optimization

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

C#可以使用融合的乘法加法吗?

如果C#编译器/抖动在所使用的硬件上可用,是否使用融合的乘法加法运算?如果可以,我是否需要设置任何特定的编译器设置才能利用它?

我的意图是将补偿算法用于扩展精度算术,并且其中一些可以编写为使用FMA。

c# fma system.numerics

5
推荐指数
1
解决办法
525
查看次数

什么是在x86上提供无分支FP min和max的指令?

引用(感谢作者开发和共享算法!):

https://tavianator.com/fast-branchless-raybounding-box-intersections/

由于现代浮点指令集可以在没有分支的情况下计算最小值和最大值

作者的相应代码就是

dmnsn_min(double a, double b)
{
  return a < b ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

我很熟悉例如_mm_max_ps,但这是一个矢量指令.上面的代码显然是用于标量形式.

题:

  • 什么是x86上的标量无分支minmax指令?这是一系列指令吗?
  • 假设它将被应用,或者如何调用它是否安全?
  • 关于min/max的无分支问题是否有意义?根据我的理解,对于光线跟踪器和/或其他视觉软件,给定光线盒交叉例程,分支预测器没有可靠的模式来拾取,因此消除分支确实有意义.我这是对的吗?
  • 最重要的是,所讨论的算法是围绕(+/-)INFINITY进行比较而建立的.这是可靠的,我们正在讨论的(未知)指令和浮点标准吗?

以防万一:我熟悉在C++中使用min和max函数,相信它是相关的,但不是我的问题.

c floating-point optimization x86 assembly

5
推荐指数
1
解决办法
1493
查看次数