浮点数上的原子操作

问题描述 投票:9回答:4

[大多数语言为原子int操作提供功能(添加,比较和交换等)。

为什么不使用浮点类型?

c operating-system kernel atomic atomicity
4个回答
5
投票

让我们从操作系统/硬件设计的角度考虑浮点原子...

存在原子是因为同步需要它们。大部分同步涉及什么?句柄,标志,互斥锁,自旋锁-实际值无意义的东西,只要每个用户一致且用户之间不同即可。即使对于信号量这样的值更有意义的东西-它仍然是counting而不是measuring,所以无论我们认为它代表什么,32位都值32位。

第二,技术问题。我们可以编程的几乎所有东西都可以进行整数运算。并不是那么浮点-当C库正在仿真FP操作时,这些原子将难以实现。即使在硬件中,FP操作通常也会比整数慢,谁想要慢速锁定? FPU本身的设计甚至可能使其难以执行原子操作-例如如果它在不直接访问内存总线的情况下挂在协处理器接口上。

第二个半月,如果我们想要float,当然我们也想要double吗?但是,double通常存在一个问题,即它比机器单词大,排除了许多架构上均匀负载和存储的原子性。

第三,当涉及到原子之类的事情时,CPU架构师倾向于实现系统设计人员和OS专业人员所要求的,并且OS专业人员通常并不完全喜欢浮点数-愚蠢的额外寄存器要保存,从而减慢了上下文切换的速度。 ..硬件中的更多说明/功能会增加功能和复杂性,并且如果客户不希望这样做...

因此,简而言之,用例不足,因此没有硬件支持,因此也没有语言支持。当然,在某些体系结构上,您可以roll your own atomics,并且我想GPU计算可能对主要在浮点硬件上的同步有更多的需求,那么谁知道它会保持这种状态呢?


1
投票

啊,原来的问题是用Go标记的,并且略有不同,所以无论如何这就是我要回答的问题,抱歉,如果这不是已编辑问题的完整答案:)

使用Go,您可以在不安全的黑暗面稍作一番就自动地交换任何指针值:

http://play.golang.org/p/aFbzUMhfEB

摘录:

var uptr unsafe.Pointer
var f1, f2 float64

f1 = 12.34
f2 = 56.78
// Original values
fmt.Println(f1, f2)
uptr = unsafe.Pointer(&f1)
atomic.SwapPointer(&uptr, unsafe.Pointer(&f2))
f1 = *(*float64)(unsafe.Pointer(uptr))
// f1 now holds the value of f2, f2 is untouched
fmt.Println(f1, f2)

交换调用(以及其他原子操作,例如CAS)映射到保证该原子性的CPU体系结构指令(有关更多详细信息,请参见https://stackoverflow.com/a/1762179/1094941)。至于为什么不支持浮子的程序集,我不知道。


1
投票

为了改进Go语言中的先前答案,我们可以使用https://golang.org/pkg/math/#Float64bitshttps://golang.org/pkg/math/#Float64frombits在不直接使用不安全的包的情况下,将float64与uint64相互转换。

给出uint64,然后我们就可以使用所有可用的原子基元。

type AtomicFloat64 uint64

func (f *AtomicFloat64) Value() float64 {
    return math.Float64frombits(atomic.LoadUint64((*uint64)(f)))
}

func (f *AtomicFloat64) Add(n float64) float64 {
    for {
        a := atomic.LoadUint64((*uint64)(f))
        b := math.Float64bits(math.Float64frombits(a) + n)
        if atomic.CompareAndSwapUint64((*uint64)(f), a, b) {
            return
        }
    }
}

0
投票

C ++ 20将获得float和double的原子专业化。 Nvidia致力于实现这一标准化。根据此处的论文(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0020r6.html),应将其用于HPC应用程序;但我无法想象这样的事情。

© www.soinside.com 2019 - 2024. All rights reserved.