【问题标题】:Implementation inline assembly of compare and swap function for Sparc V8Sparc V8比较和交换函数的内联汇编实现
【发布时间】:2012-02-20 10:59:26
【问题描述】:

我的 gcc 交叉编译器不支持Built-in functions for atomic memory access。我如何使用 Sparc V8 架构的内联汇编来实现以下功能:

long __sync_val_compare_and_swap (long *ptr, long oldval long newval)
{
....
}

那些内置执行原子比较和交换。即如果*ptr的当前值为oldval,则将newval写入*ptr。

【问题讨论】:

标签: c gcc assembly sparc


【解决方案1】:

SPARC V8 没有 CAS 指令,因此您必须以某种方式模拟它。例如。使用 http://www.oracle.com/technetwork/server-storage/solaris10/index-142944.html 的 CAS 类 C 伪代码并使用静态 pthread 互斥锁来确保原子 {} 区域的原子性。

【讨论】:

  • 互斥锁是不够的;它不会提供重入,因此您还需要为每个 CAS 产生两个系统调用来阻止和解除阻止所有信号。更好的解决方案是修复内核,就像修复 Linux 以使 ARM 使用内核辅助 CAS 一样,在非中断情况下没有开销:lwn.net/Articles/314561 请注意,这不适用于 SMP,但如果你是尝试将 SMP 与无法提供原子 CAS 的机器一起使用,嗯,这不是一个好主意...
  • @R..: 是的,只是表明如果你想处理所有情况,模拟原子原语会变得昂贵.. :) FWIW,SPARC V8 具有 ldstub 和交换原子指令,这足以实现简单的自旋锁或类似的东西,但 AFAICS 不够通用,无法根据它们实现 CAS 的简单实现。
  • 请注意,某些 pthread 原语(尤其是信号量)的一致实现似乎需要原子 CAS。否则,您会遇到自同步破坏问题,如果没有内核调解每个操作似乎无法解决(即,通过在禁用中断的系统调用中让内核完全模拟 CAS)。原子交换是不够的。
  • 顺便说一句,我开始想知道 SPARC V8 LEON(或者这些天有其他相关的 SPARC V8 实现吗?)处理器如何支持没有 CAS 的 SMP Linux,答案是,嗯,支持 SMP 的 LEON 版本“向后移植”了 SPARC V9 的 CAS 指令。
  • AFAIK,从来没有/从来没有像“纯sparcv8”这样的东西; 32 位“经典”SPARC (sun4/4m/4d) 是 sparcv7 并且确实只知道 ldstub/swap,但所有支持 64 位的 SPARC (sun4u/us/v) 的 32 位模式实际上是 sparcv8+并且cas 和朋友。 sparcv8 和sparcv8+ 之间的实际区别是什么(如果有的话),以及(假设有任何区别),什么 CPU 是 sparcv8 而不是 sparcv8+ ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2023-03-14
相关资源
最近更新 更多