繁体   English   中英

并行使用中内联asm的设计元素

[英]Design elements for inline asm in concurrent usage

我找不到一个关于我应该如何编写一行内联asm的简洁解释,以及在同时使用包含asm代码的foo函数时可能产生的问题是什么。

我看到的问题是,在asm ,寄存器是唯一命名的,因此1个名称严格依赖于cpu的一个非常精确的部分,如果你要编写一段应该同时运行的代码,这是一个很大的问题。因为你不能简单地使用相同名称的额外寄存器。

另一个问题是asm并没有真正使用调用约定,你只需要调用寄存器和/或值,有时调用寄存器意味着对另一个寄存器的静默操作甚至不会在代码中显示; 所以我甚至不能指望我的C / C ++函数foo将被打包并密封在它自己的堆栈中,如果它包含asm代码。

现在用gcc调用extended asm我基本上可以声明输入和输出的位置,所以每个函数都可以使用自己的参数“作为寄存器” ,模式如下

   asm ( assembler template 
       : output               
       : input               
       : registers 
       );

假设我现在的主要目标是数学运算,而我的函数只能提供某种功能并执行一些计算(没有内部锁定),那么扩展asm对并发性有好处吗? 我应该如何设计一个应该由并发应用程序使用的asm?

现在我正在使用gcc ,但我想要一个关于一般asm设计的通用答案,我应该给这种代码片段。

你似乎误解了线程究竟是什么。 我们先考虑一个单处理器系统。 线程实际上并不是并发运行的,因为只有一个单元可以成功解码并执行它们。 您的操作系统只是通过在其中使用调度来创建运行多个线程(以及进程)的错觉:每个线程或进程被分配一定的时间,它在处理器上执行。

这就是为什么在执行线程时,它们不会覆盖彼此的寄存器。 当切换当前执行的线程或进程时,操作系统要求处理器执行称为上下文切换的操作。 简而言之,处理器在执行上一个任务/线程/进程时将其状态保存到某个由OS控制的内存区域。 新任务/线程/进程从先前存储的状态恢复其上下文并继续执行。 当CPU上的此任务/线程/进程的时间片启动时,调度程序决定下一个要恢复的任务/线程/进程。 时间片通常非常小,这就是为什么你会被赋予同时运行多个代码流的错觉。 请记住,这是一个非常非常简化的描述:有关更多详细信息,请参阅CPU手册或操作系统上的书籍。

这种情况在多处理器系统上是类似的:只有例外情况是,有多个单元可以执行指令。 对于多核处理器也是如此:每个核都有自己的寄存器集。 基本内容保持不变 - 操作系统中的调度程序决定正在执行的代码是否实际上由一个处理器中的多个内核同时执行。

因此,您在这种情况下的顾虑无效。 但是,他们的提出是出于非常正当的理由。 请记住,线程共享的唯一内容是主内存:每个线程都有自己的寄存器和自己的堆栈。

让我回到关于gcc扩展内联汇编的实际问题。 编译器本身无法确定您编写的程序集修改了哪些寄存器。 这就是你需要指定它的原因。 但是,如果一条指令在没有你能够控制它的情况下修改寄存器是非常罕见的,并且它只发生在少量指令中 - 假设我们正在谈论x86。 此外,当您想从程序集内部引用C / C ++变量时,gcc可以自行计算目标/源操作数。 实际上,这是首选方法,因为它为编译器留下了更多优化空间。

考虑一下这段代码:

unsigned int get_cr0(void)
{
    unsigned int rc;
    __asm__ (
        "movl %%cr0, %0\n"
        : "=r"(rc)
        :
        :
    );
    return rc;
}

该函数的目的是返回控制寄存器cr0的内容。 这是一个特权指令,因此当您在用户模式下运行程序时程序将无法运行,但现在这并不重要。 看看我如何将%0放入指令中,然后在输出列表中指定"=r"(rc) 这意味着%0将由编译器自动别名为rc变量。 您可以对在输入/输出列表中指定的每个变量执行此操作。 正如您所看到的,它们从零开始编号。

我真的不记得使用未编码为操作数的寄存器的指令,所以我现在不能给你一个例子。 在这种情况下,您需要将它们放在clobber列表(最后一个)上。 我很确定你可以参考这个来获取更多信息。

我也无法回答有关“一般asm设计”的任何内容,因为这是一个非标准扩展,因此在编译器之间有所不同。 例如,64位Visual Studio编译器根本不支持它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM